Bash හි ගොනුවක ආරම්භයට පෙළ එකතු කරන්නේ කෙසේද?


317

හායි මට ගොනුවකට පෙළ සකස් කිරීමට අවශ්‍යයි. උදාහරණයක් ලෙස මට todo.txt ගොනුවක ආරම්භයට කාර්යයන් එක් කිරීමට අවශ්‍යයි. මම දන්නා echo 'task goes here' >> todo.txtනමුත් එය ගොනුවේ අවසානයට රේඛාව එක් කරයි (මට අවශ්‍ය දේ නොවේ).


2
විශාල ලිපිගොනු සඳහා එය කිරීමට කාර්යක්ෂම ක්‍රමයක් නොමැති නම්: unix.stackexchange.com/questions/87772/…
සිරෝ සැන්ටිලි 冠状 病毒 审查 六四 法轮功 法轮功

method ඔබ මෙම ක්‍රමය දෙස බලනවාද superuser.com/a/1352628/11116
ඉවාන් කැරොල්

Answers:


414
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt

හෝ

sed -i '1s/^/task goes here\n/' todo.txt

හෝ

sed -i '1itask goes here' todo.txt

6
පළමුවැන්න විශිෂ්ටයි! තර්කනය පැහැදිලි කිරීමට ඔබට අවශ්‍යද? සින්ටැක්ස් අර්ථ නිරූපණය කරන්නේ කෙසේදැයි මට විශේෂයෙන් විශ්වාස නැත.
user479534

48
@ user8347: පයිප් ( |) පණිවිඩය ( echo '...') catභාවිතා කරන -(සම්මත ආදානය) පළමු ගොනුව todo.txtලෙසත් දෙවන ගොනුව ලෙසත්. catබහුවිධ ගොනු සම්බන්ධ කරයි. ප්‍රතිදානය ( >) නම් කරන ලද ගොනුවකට යවන්න temp. ( &&) සිට දෝෂ නොමැති catනම් ( mv) tempගොනුව මුල් ගොනුවට ( todo.txt) නැවත නම් කරන්න .
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

1
@itaifrenkel: ඔබ කළ දේ මට දැකීමට සිදුවේ, නමුත් catවචනයේ පරිසමාප්ත අර්ථයෙන්ම n ලැබුනහොත් එය නව රේඛාවක් බවට පරිවර්තනය නොවේ. වෙන දෙයක් ඒක කරන්න ඇති. ඒ වෙනුවට cat, hexdump -Cඔබ සැබවින්ම බැක්ස්ලෑෂ් සහ එන් යවන්නේද නැතහොත් එය නව රේඛාවක්ද යන්න බැලීමට උත්සාහ කරන්න . ඔබට cat -eපේළි කෙළවර පෙන්වීමට උත්සාහ කළ හැකිය .
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

1
2 සහ 3 භාවිතා කිරීම (3 මට වඩා සරල බව පෙනේ) එකවර බොහෝ ලිපිගොනු සඳහා පෙළ සකස් කිරීමට ඔබට ඉඩ සලසයි .
ෆීලික්ස්

4
Ira කිරා: 1මාධ්‍යයන් ඊළඟ විධානය කරන්නේ ගොනුවේ පළමු පේළියේ පමණක් වන අතර iවිධානය ඇතුල් කරනු ලැබේ. "ලිපින" කොටස යටතේ ඇති "පිටුවෙහි" සහ "ශුන්‍ය හෝ එක් ලිපින විධාන" කොටසේ බලන්න.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

83

මගේ මතය අනුව සරල විකල්පයක් නම්:

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

මෙම කෘති විධානය තුල නිසා $(...)පෙර ක්රියාත්මක වන todo.txtලියැවෙනු ඇත> todo.txt

අනෙක් පිළිතුරු හොඳින් ක්‍රියාත්මක වන අතර, මම මෙය දිනපතා දෝංකාරය සහ බළලා භාවිතා කරන නිසා මෙය මතක තබා ගැනීම පහසුය.

සංස්කරණය කරන්න: පසුපෙළවල් තිබේ නම් මෙම විසඳුම ඉතා නරක අදහසකි todo.txt, මන්ද -eධජයේ දෝංකාරයට ස්තූතිවන්ත වීමෙන් ඒවා අර්ථ නිරූපණය වනු ඇත. නව රේඛා පෙරවදනට ඇතුළත් කිරීමට තවත් පහසු ක්‍රමයක් වන්නේ ...

echo "task goes here
$(cat todo.txt)" > todo.txt

... හුදෙක් නව රේඛා භාවිතා කිරීමට. ෂුවර්, එය තවදුරටත් එක් ලයිනර් නොවේ, නමුත් යථාර්ථවාදීව එය මීට පෙර එක් ලයිනර් එකක් නොවීය. ඔබ මෙය ස්ක්‍රිප්ට් එකක් තුළ කරන්නේ නම්, සහ ඉන්ඩෙන්ටින් කිරීම ගැන කනස්සල්ලට පත්ව සිටී නම් (උදා: ඔබ මෙය ශ්‍රිතයක් තුළ ක්‍රියාත්මක කරයි) මෙය ඇතුළුව නමුත් ඒවාට පමණක් සීමා නොවී මෙය තවමත් මනාව ගැලපෙන පරිදි සකස් කළ හැකි ක්‍රියාමාර්ග කිහිපයක් තිබේ:

echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt

එසේම, නව රේඛාවක් අවසානයට එකතු වේ දැයි ඔබ සැලකිලිමත් වන්නේ නම් todo.txt, මේවා භාවිතා නොකරන්න. හොඳයි, දෙවන සිට අන්තිම එක හැර. එය අවසානය සමඟ පටලවා නොගනී.


1
මට $ (...) කිසිසේත් ක්‍රියාත්මක නොවේ.
SCL

2
එය තනි වෙනුවට ද්විත්ව උපුටා දැක්වීම් සමඟ වඩා හොඳින් (හෝ කිසිසේත්) ක්‍රියා කළ හැකිය…
ℝaphink

5
නො වනු ඇත -eද todo.txt තුල පැන අනුක්රමය පරිවර්තනය?
mk12

2
උත්සහ අස්වැන්න -> බළලා: <ගමනාන්තය ගොනු>: ආදාන ගොනු ප්රතිදානය ගොනුව ...
ingyhere

printf වේදිකා හරහා වඩා ස්ථාවර වන අතර සාමාන්‍යයෙන් echo -e ට වඩා සුමට ලෙස ක්‍රියා කළ යුතුය
පීටර් බර්ග්

29

බොහෝ බෙදාහැරීම් වලදී ඔබට භාවිතා කළ හැකිය tee:

echo "task goes here" | cat - todo.txt | tee todo.txt

විකල්පයක් නම් moreutilsහොඳ මෙවලමක් ඇති sponge:

echo "task goes here" | cat - todo.txt | sponge todo.txt

teeහා spongeඔබ තාවකාලික ගොනු ගැන කරදර වෙන්න ඕනේ සහ ඒ අවට ඔවුන් ගමන් කරන්නේ නැහැ, ඉන් අදහස් වන්නේ, ගොනුව කිරීමට STDIN පසුව ලිවිම "දක්වා පොඟවා ගැනීම සිදු කරයි" ඇත.

ඔබ විසින් ලබා ගත හැකි moreutilsහරහා බොහෝ ලිනක්ස් distros සමග apt-get install moreutilsභාවිතා, හෝ OS X මෙහෙයුම් පද්ධතිය මත බරපැනක් සමග, brew install moreutils.


මම මේ සඳහා යන්නෙමි (echo 'ble'; cat todo.txt):-)
සිරෝ සැන්ටිලි 冠状 病毒 审查 六四 事件 法轮功

teeecho "task goes here" | cat - todo.txt | tee todo.txt
ඒන්ජල් 115 හි

@ Angel115 හොඳ යෝජනාවක්. spongeවෙනස් ආකාරයකින් කරන්නේ කුමක්දැයි මට විශ්වාස නැත , සමහර විට එය ආදානය සම්පූර්ණයෙන්ම වළක්වයි?
slhck

12

ඔබට Vim in Ex මාදිලිය භාවිතා කළ හැකිය:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 පළමු පේළිය තෝරන්න

  2. i ඇතුළු කරන්න

  3. x සුරකින්න සහ වසා දමන්න


5

ඔබට නව තාවකාලික ගොනුවක් සෑදිය හැකිය.

echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt

ඔබ ද භාවිතා කළ හැක sedහෝ awk. නමුත් මූලික වශයෙන් එකම දේ සිදු වේ.


1
ඔබට තැටියේ ඉඩක් නොමැති බව පවසන්න එවිට new_todo.txtඑය අර්ධ වශයෙන් පමණක් ලියා ඇත. ඔබේ විසඳුම මුල් ගොනුව නැති වූ බවක් පෙනේ.
NPE

තැටි අවකාශයෙන් ඉවතට යන්නේ කවුද? ;-) එය සරල උදාහරණයක් පමණි.
කීත්

2
E කීත් විශේෂයෙන් විශාල අතථ්‍ය ධාවකයක් අවශ්‍ය යැයි අපේක්ෂා නොකළ VM එකක වැඩ කරන කෙනෙක්. නැත්නම් කවුරුහරි විශාල ගොනුවක් ගෙන යනවා. කෙසේ වෙතත්, මෙයට එරෙහි සැබෑ තර්කය වන්නේ නාමාවලි අවසරයන් ය; දී ඇති නාමාවලියෙහි නව ලිපිගොනු සෑදීමට ඔබට අවසර නොමැති නම්, ඔබේ ස්ක්‍රිප්ටයේ සාර්ථකව ක්‍රියාත්මක වන එකම විධානය rmමුල් ගොනුවේ වේ.
පාර්තියන් වෙඩි තැබීම

3

පෙළ ගොනුව මතකයට සරිලන තරම් කුඩා නම්, එය ප්‍රතිස්ථාපනය කිරීම සඳහා තාවකාලික ගොනුවක් සෑදිය යුතු නැත. ඔබට ඒ සියල්ල මතකයට පටවා නැවත ගොනුවට ලිවිය හැකිය.

echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt

සම්පූර්ණ ගොනුව ලිවීමෙන් තොරව ගොනුවේ ආරම්භයට රේඛා එක් කළ නොහැක.


පැහැදිලි ප්‍රශ්නය ඇසීමට: ෂෙල් විචල්‍යයන්ගේ අක්ෂර සීමාව කොහිද?
nixda

මා දන්නා පරිදි, එය ලබා ගත හැකි මතක ප්‍රමාණයෙන් පමණක් සීමා වේ. මම 100MB ට වඩා වැඩි විචල්‍යයන් මතකයේ පුරවා ඇත. text=$(cat file). ෂෙල් විචල්‍යයන් ද්විමය පිරිසිදු නොවන නිසා පෙළ පමණක් භාවිතා කිරීමට ප්‍රවේශම් වන්න mywiki.wooledge.org/BashFAQ/058
Rucent88

3

ගොනුවක ආරම්භයේ දී ඔබට අන්තර්ගතය ඇතුළත් කළ නොහැක. ඔබට කළ හැකි එකම දෙය වන්නේ පවතින අන්තර්ගතය ප්‍රතිස්ථාපනය කිරීම හෝ ගොනුවේ වත්මන් අවසානයෙන් පසුව බයිට් එකතු කිරීමයි.

ඔබගේ ප්‍රශ්නයට ඕනෑම විසඳුමක් සඳහා තාවකාලික ගොනුවක් (හෝ බෆරයක්) නිර්මාණය කිරීම අවශ්‍ය වේ (මතකයේ හෝ තැටියේ) එය අවසානයේදී මුල් ගොනුව නැවත ලියයි.

නව ගොනුව නිර්මාණය කිරීමේදී මුල් ගොනුව සුරැකීමෙන් දත්ත නැති නොවීමට වගබලා ගන්න, ක්‍රියාවලිය අතරතුර ගොනු පද්ධතිය පිරී තිබේ නම්. උදා:

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt

ඔවුන්ගේ අභිප්‍රේරණය පැහැදිලි කිරීම සඳහා ඩවුන්වෝටර්වරුන් සාදරයෙන් පිළිගනී. පිළිගත් පිළිතුර ඇතුළුව ඉතිරි පිළිතුරු කිසිවක් මගේ පිළිතුරේ කිසිවක් පරස්පර නොකරයි.
jlliagre

මෙය <...> වරහන් මෙන් විග්‍රහ කිරීම අපහසුය, ඒවා එසේ නොවන බව මම සිතමි. <සහ (අතර උදව් විය හැකිද?
dumbledad

මෙය මට වැඩ කරන්නේ නැත. echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'ක්‍රියා කරන නමුත් cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'දෝෂය ලබා දෙයි "echo: එවැනි ගොනුවක් හෝ නාමාවලියක් නැත"
dumbledad

umbumledad ඔබ මගේ පිළිතුර අවතක්සේරු කරනවා. ඔබට එය විග්‍රහ කිරීමට කිසිවක් නැත. <සහ අතර අවකාශයක් (වාක්‍ය ඛණ්ඩය බිඳ දමනු ඇත. උත්සාහ කරන්නcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
jlliagre


0

GitBash + Windows10 + Multline :

මෙන්න ඔබට බහු රේඛා නූල් භාවිතා කිරීමට ඉඩ දෙන අනුවාදයකි .

##############################################
## This section for demo purpose only,      ##
## So you can save entire file as           ##
## whatever.sh and run it.                  ##
##                                          ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################

## Below is main code:

##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//|  +-------------------------------------+   |//
//|  |                                     |   |//
//|  |     MESSAGE_FOR_HEAD_OF_FILE        |   |//
//|  |                                     |   |//
//|  +-------------------------------------+   |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE                       ##
TEX=$ADD_TO_HEAD_VARIABLE                       ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################

## Expected contents of MY_TARGET_FILE.txt :
## //|  +-------------------------------------+   |//
## //|  |                                     |   |//
## //|  |     MESSAGE_FOR_HEAD_OF_FILE        |   |//
## //|  |                                     |   |//
## //|  +-------------------------------------+   |//
## [STARTER_CONTENT]

0

අවසාන පිළිතුර

cat <<< "prepended text
$(cat test.txt)" > test.txt

සන්දර්භය

යතුරු ලියනය කිරීමක් ලෙස ඔවුන්ට හැඟුණු නිසා මම පිළිතුරු ගැන සෑහීමකට පත් නොවෙමි. මම ජෝන් ඇල්බට්ස්ගේ පිළිතුරට කැමතියි නමුත් ටයිප් කිරීමට නොහැකි විය -e. අවාසනාවකට මෙන්, මම අහම්බෙන් ජෝන් ඇල්බට්ස්ගේ echoලයිනර් 2 කියවා බැලුවෙමි (මෙම පිළිතුරේ වටිනාකම සැලකිය යුතු ලෙස අඩු කර මා විනාඩි 30 ක් පමණ සෙල්ලම් කළෙමි, නමුත් හොඳයි, එය සිදු වේ).

කෙසේ වෙතත්, මම අවධානය යොමු කළේ ඔබට අවශ්‍ය ලිපිගොනු සහ පෙළ ටයිප් කිරීමට පමණක් අවශ්‍ය වන යමක් සොයා ගැනීමට ය.

එපමණක්ද නොව, මම සෞන්දර්යාත්මකව පෙනෙන යමක් සොයමින් සිටියෙමි. ඒ සමඟ මා අදහස් කළේ: පූර්ව සූදානම භෞතිකව පෙන්විය යුතුය, එය මායාවක් වුවද එය සිහිවටනයක බලපෑමක් ඇති කරයි.

ඒ නිසා මම නිවැරදි සන්දර්භය තුළ සංජානන වික්‍රියාව අඩු කරන බැවින් (එනම් <3 වතාවක් ටයිප් කිරීම ඕනෑවට වඩා සිතීමේ ශක්තියක් අවශ්‍ය නොවේ).

මම test.txtවචනය සමඟ ගොනුවක් නිර්මාණය කළෙමි "monkeys".

මම ටයිප් කළෙමි:

cat <<< "prepend
> $(< test.txt)"

ප්‍රතිදානය:

prepend
monkeys

ටිකක් පැහැදිලි කිරීම:

ඔබ අතින් ඔබන්න enter.

දෙවන පේළියේ >එය කවචයේ සිටම වේ, ඔබට එය ටයිප් කිරීමට අවශ්‍ය නැත.

සටහන්:

(1) මට කළමනාකරණය කළ නොහැකි වූයේ එක් ලයිනර් ය. මට භාවිතා කළ හැකි $()සහ වෙනස් කිරීමේ සංයෝජනයක් නොමැති බව පෙනේ \n. අළුත් රේඛාව ඔබ විසින්ම ඔබන්න.

(2) $(< test.txt)ට සමාන බලපෑමක් ඇත $(cat test.txt). මෙම බෑෂ් විමර්ශන අත්පොත රාජ්යයන්:

විධාන ආදේශනය $(cat file)සමාන නමුත් වේගවත් ආදේශ කළ හැකිය $(< file).

එබැවින් ඔබට ද කළ හැකිය:

cat <<< "prepend
> $(cat test.txt)"

වැඩිපුර ටයිප් කිරීම, නමුත් catදෙවරක් යතුරු ලියනය කර ඇති බැවින් එය ටිකක් අඩු සංජානන වික්‍රියා බව මම පිළිගනිමි .

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.