Sed භාවිතා කරමින් නව රේඛාවක් (\ n) ප්‍රතිස්ථාපනය කරන්නේ කෙසේද?


1386

විධානය භාවිතා කර නව රේඛාවක් (" \n") අවකාශයක් (" ") ආදේශ කරන්නේ කෙසේද sed?

මම අසාර්ථක ලෙස උත්සාහ කළෙමි:

sed 's#\n# #g' file
sed 's#^$# #g' file

මම එය නිවැරදි කරන්නේ කෙසේද?


28
trතනි අක්‍ෂරයක් සඳහා තනි අක්‍ෂරයක් ආදේශ කරන්නේ නම් කාර්යය සඳහා නිවැරදි මෙවලම පමණක් වන අතර ඉහත උදාහරණයෙන් දැක්වෙන්නේ නව රේඛාව අවකාශයක් වෙනුවට ආදේශ කිරීමයි .. එබැවින් ඉහත උදාහරණයේ දී tr වැඩ කළ හැකිය .. නමුත් පසුව සීමා වනු ඇත.
කෝපාවිෂ්ට 84

9
trඔහුගේ උදාහරණයේ පෙන්වා ඇති පරිදි, සෑම නව රේඛාවක්ම ප්‍රතිස්ථාපනය කිරීමට ප්‍රශ්න කරන්නාට අවශ්‍ය වූ නිසා කාර්යය සඳහා නිවැරදි මෙවලමක. නව රේඛා ආදේශ කිරීම අද්විතීය ලෙස චාම් වන sedනමුත් පහසුවෙන් කළ හැකිය tr. මෙය පොදු ප්‍රශ්නයකි. රීජෙක්ස් ප්‍රතිස්ථාපනය සිදු කිරීම සිදු කරන්නේ trඑය නොව sed, එය නිවැරදි මෙවලම වනු ඇත ... වෙනත් ප්‍රශ්නයකට.
මයික් එස්

3
“tr” ට නව රේඛාව මකා දැමිය හැකිය “tr -d” \ n '`කෙසේ වෙතත් ප්‍රතිලාභ වඩාත් විශ්වීය` tr -d' to 012 \ 015 '`ලෙස මකා දැමීමට ඔබ කැමති විය හැකිය.
ඇන්තනි

2
අවවාදයයි: ලිනක්ස් සහ පැරණි සොලාරිස් යන්ත්‍ර (EG sol5.8) අතර අක්ෂර පරාසයක් සම්බන්ධයෙන් “tr” වෙනස් ලෙස ක්‍රියා කරයි. EG: `tr -d 'az' 'සහ' tr -d '[az]'`. ඒ සඳහා මම ඔබට නිර්දේශ කරන්නේ එම වෙනසක් නැති "sed" භාවිතා කරන්න.
ඇන්තනි

2
Ike මයික්ස් පිළිතුරට ස්තූතියි. අනුගමනය tr '\012' ' 'සමග echo. එසේ නොමැතිනම් ගොනුවේ අවසාන පේළිය ද මකා දමනු ලැබේ. tr '\012' ' ' < filename; echoඋපක්‍රමය කරයි.
බර්නි රයිටර්

Answers:


1529

GNU සමඟ මෙම විසඳුම භාවිතා කරන්න sed:

sed ':a;N;$!ba;s/\n/ /g' file

මෙය සම්පූර්ණ ගොනුව ලූපයකින් කියවනු ඇත, පසුව නව රේඛා (ය) අවකාශය සමඟ ප්‍රතිස්ථාපනය කරයි.

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

  1. හරහා ලේබලයක් සාදන්න :a.
  2. රටා අවකාශයට වත්මන් සහ ඊළඟ පේළිය එකතු කරන්න N.
  3. අප අන්තිම පේළියට පෙර නම්, සාදන ලද ලේබලය වෙත ශාඛා කරන්න $!ba( $!එයින් අදහස් කරන්නේ අවසාන පේළියේ එය නොකළ යුතු බැවින් එක් අවසාන නව රේඛාවක් තිබිය යුතුය).
  4. අවසාන වශයෙන් ආදේශනය සෑම නව රේඛාවක්ම රටා අවකාශයේ ඉඩක් ආදේශ කරයි (එය සම්පූර්ණ ගොනුවයි).

BSD සහ OS X සමඟ ක්‍රියා කරන හරස් වේදිකා අනුකූල සින්ටැක්ස් මෙන්න sed( en බෙන්ජි අදහස් අනුව ):

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file

ඔබට පෙනෙන පරිදි, sedවෙනත් ආකාරයකින් සරල ගැටළුවක් සඳහා භාවිතා කිරීම ගැටළු සහගතය. සරල හා ප්‍රමාණවත් විසඳුමක් සඳහා මෙම පිළිතුර බලන්න .


109
අර්ධ කොලෝන් සමඟ වෙන්වීමට වඩා විධාන වෙන වෙනම ක්‍රියාත්මක කිරීමෙන් ඔබට මෙම හරස් වේදිකාව (එනම් මැක් ඕඑස් එක්ස් මත) ධාවනය කළ හැකිය: sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'
බෙන්ජි

1729

sedරේඛීය පාදක ආදානය මත භාවිතා කිරීමට අදහස් කෙරේ. එය ඔබට අවශ්‍ය දේ කළ හැකි වුවද.


මෙහි වඩා හොඳ විකල්පයක් වන්නේ trවිධානය පහත පරිදි භාවිතා කිරීමයි :

tr '\n' ' ' < input_filename

හෝ නව රේඛා අක්ෂර සම්පූර්ණයෙන්ම ඉවත් කරන්න:

tr -d '\n' < input.txt > output.txt

හෝ ඔබට GNU අනුවාදය තිබේ නම් (එහි දිගු විකල්ප සමඟ)

tr --delete '\n' < input.txt > output.txt

Sed ට එය කළ නොහැක්කේ මන්දැයි මට තේරුම් ගත නොහැක. කරුණාකර, විවිධ මෙවලමක් භාවිතා කිරීමට පැහැදිලි කරන්න.
Léo Léopold Hertz 준영

89
සෙඩ් යනු රේඛා මත පදනම් වූ බැවින් නව රේඛා ග්‍රහණය කර ගැනීම දුෂ්කර ය.
ඇලෙක්සැන්ඩර් ග්ලැඩිෂ්

1
ඇලෙක්සැන්ඩර්: “ප්‍රවාහ සංස්කාරකය” යන්නෙන් අදහස් කරන්නේ රේඛා පදනම් වූවක්ද? සමහර විට, නම අවුල් සහගත ය.
Léo Léopold Hertz 준영

193
sed ක්‍රියා කරන්නේ ආදාන “ප්‍රවාහයක්” මත වන නමුත් එය නව රේඛා වෙන් කළ කුට්ටි වලින් එය වටහා ගනී. එය යුනික්ස් මෙවලමක් වන අතර එයින් අදහස් කරන්නේ එය එක් දෙයක් ඉතා හොඳින් කරන බවයි. එක් දෙයක් නම් "ලිපිගොනු අනුව වැඩ කිරීම" යන්නයි. එය වෙනත් දෙයක් කිරීම දුෂ්කර වන අතර අවදානම් දෝෂ සහිත වේ. කතාවේ සදාචාරය නම්: නිවැරදි මෙවලම තෝරන්න. ඔබගේ බොහෝ ප්‍රශ්න බොහෝ විට "මෙම මෙවලම කිසි විටෙකත් කිරීමට අදහස් නොකළ දෙයක් කරන්නේ කෙසේද?" එම ප්‍රශ්න සිත්ගන්නා සුළු ය, නමුත් ඒවා සැබෑ ගැටළුවක් විසඳීමේ දී මතුවන්නේ නම්, ඔබ බොහෝ විට එය වැරදිය.
dmckee --- හිටපු උපපරිපාලක පූස් පැටවා

505

වේගවත් පිළිතුර

sed ':a;N;$!ba;s/\n/ /g' file
  1. : a 'a' ලේබලයක් සාදන්න
  2. N ඊළඟ පේළිය රටා අවකාශයට එකතු කරන්න
  3. $! අන්තිම පේළිය නොවේ නම් , ba ශාඛාව (යන්න) 'a' ලේබලය
  4. s ආදේශකය , / line n / නව රේඛාව සඳහා රීජෙක්ස් , / / අවකාශයකින් , / g ගෝලීය ගැලපීම (හැකි තරම් වාරයක්)

අවසාන පේළියට ළඟා වන තෙක් sed 1 සිට 3 දක්වා පියවර හරහා ලූපය, සියලු රේඛා රටා අවකාශයට ගැළපෙන පරිදි sed සියළුම අක්ෂර ආදේශ කරයි


විකල්ප

සියලුම විකල්පයන්, sed මෙන් නොව ක්‍රියාවලිය ආරම්භ කිරීම සඳහා අවසාන පේළියට ළඟා වීමට අවශ්‍ය නොවනු ඇත

බෑෂ් සමඟ , මන්දගාමී

while read line; do printf "%s" "$line "; done < file

සමග perl බසට ලං , sed -like වේගය

perl -p -e 's/\n/ /' file

tr සමඟ , sed ට වඩා වේගවත් , එක් අක්ෂරයකින් පමණක් ප්‍රතිස්ථාපනය කළ හැකිය

tr '\n' ' ' < file

පේස්ට් සමඟ , tr- සමාන වේගයකින්, එක් අක්ෂරයකින් පමණක් ආදේශ කළ හැකිය

paste -s -d ' ' file

සමග awk , tr වේගය -like

awk 1 ORS=' ' file

"Echo <(<file)" වැනි වෙනත් විකල්පයක් මන්දගාමී වන අතර එය කුඩා ලිපිගොනු මත පමණක් ක්‍රියාත්මක වන අතර ක්‍රියාවලිය ආරම්භ කිරීම සඳහා සම්පූර්ණ ගොනුව සැකසීමට අවශ්‍ය වේ.


නිතර අසන පැන 5.10 වෙතින් දිගු පිළිතුර

5.10. Escape n ගැලවීමේ
අනුක්‍රමය භාවිතා කර මට නව රේඛාවක් ගැලපීමට හෝ මකා දැමීමට නොහැකි ඇයි ? මට lines n භාවිතා කරමින් පේළි 2 ක් හෝ වැඩි ගණනක් ගැලපෙන්නේ නැත්තේ ඇයි?

Line n කිසි විටෙකත් රේඛාව අවසානයේ නව රේඛාවට නොගැලපේ, මන්ද රේඛාව රටා අවකාශයට
තැබීමට පෙර සෑම විටම නව රේඛාව ඉවත් කරනු ලැබේ
. රටා අවකාශයට පේළි 2 ක් හෝ වැඩි ගණනක් ලබා ගැනීමට,
'N' විධානය හෝ ඊට සමාන දෙයක් භාවිතා කරන්න ('H; ...; g;' වැනි).

සෙඩ් මේ ආකාරයට ක්‍රියා කරයි: sed වරකට එක් පේළියක් කියවයි,
අවසන් වන නව රේඛාව කපා දමයි
, සෙඩ් ස්ක්‍රිප්ටයට ආමන්ත්‍රණය කිරීමට හෝ වෙනස් කිරීමට හැකි රටා අවකාශයට ඉතිරිව ඇති දේ සහ රටා අවකාශය
මුද්‍රණය කළ විට, නව රේඛාවක් stdout සඳහා එකතු කරයි (හෝ ගොනුවකට).
රටා අවකාශය 'd' හෝ 'D' සමඟ මුළුමනින්ම හෝ අර්ධ වශයෙන් මකා දැමුවහොත්, එවැනි අවස්ථා වලදී
නව රේඛාව එකතු නොවේ . මේ අනුව, ස්ක්‍රිප්ට් කැමතියි

  sed 's/\n//' file       # to delete newlines from each line             
  sed 's/\n/foo\n/' file  # to add a word to the end of each line         

රටා අවකාශයට රේඛාව දැමීමට පෙර
නව රේඛාව ඉවත් කරන බැවින් කිසි විටෙකත් ක්‍රියා නොකරනු ඇත . ඉහත කාර්යයන් ඉටු කිරීම සඳහා,
ඒ වෙනුවට මෙම ස්ක්‍රිප්ට් වලින් එකක් භාවිතා කරන්න:

  tr -d '\n' < file              # use tr to delete newlines              
  sed ':a;N;$!ba;s/\n//g' file   # GNU sed to delete newlines             
  sed 's/$/ foo/' file           # add "foo" to end of each line          

GNU sed හැරුණු විට sed වල අනුවාද
රටා බෆරයේ ප්‍රමාණයට සීමාවන් ඇති බැවින් යුනික්ස් 'tr' උපයෝගීතාව මෙහිදී වඩාත් සුදුසු වේ.
ගොනුවේ අවසාන පේළියේ නව රේඛාවක් තිබේ නම්, GNU sed විසින්
එම නව රේඛාව ප්‍රතිදානයට එකතු කරනු ඇති නමුත් අනෙක්
සියල්ල මකා දමනු ඇත, නමුත් tr සියලු නව රේඛා මකා දමනු ඇත .

පේළි දෙකක හෝ වැඩි ගණනක කොටසකට ගැලපීම සඳහා මූලික තේරීම් 3 ක් ඇත:
(1) රටා අවකාශයට ඊළඟ පේළිය එක් කිරීමට 'එන්' විධානය භාවිතා කරන්න;
(2) වත්මන් රේඛාව
හෝල්ඩ් අවකාශයට එකතු කිරීම සඳහා අවම වශයෙන් දෙවරක්වත් 'එච්' විධානය භාවිතා කරන්න , ඉන්පසු රැඳවුම් අවකාශයේ සිට රේඛා
x, g, හෝ G සමඟ ලබා ගන්න; හෝ (3)
නිශ්චිත ලිපින දෙකක් අතර රේඛා ගැලපීම සඳහා ලිපින පරාස භාවිතා කරන්න (ඉහත 3.3, ඉහත කොටස බලන්න) .

තේරීම් (1) සහ (2) රටා අවකාශයට \ n දමනු ඇත, එහිදී එය
අපේක්ෂිත පරිදි ආමන්ත්‍රණය කළ හැකිය ('s / ABC X nXYZ / හෝඩිය / g').
රේඛා වාරණයක් මකා දැමීමට 'එන්' භාවිතා කිරීමේ එක් උදාහරණයක් 4.13 වගන්තියේ දැක්වේ
(" නිශ්චිත අඛණ්ඩ පේළි සමූහයක් මකා දැමිය හැක්කේ කෙසේද ?").
මකාදැමීමේ විධානය
'p' (මුද්‍රණය), 'i' (ඇතුළු කරන්න), 'c' (වෙනස් කිරීම), 'a' (එකතු කරන්න)
හෝ 's' (ආදේශක) වැනි වෙනත් දෙයකට වෙනස් කිරීමෙන් මෙම උදාහරණය වෙනස් කළ හැකිය. .

තෝරාගැනීම (3) \ n රටාව අවකාශය තුලට දමා නැත, නමුත් එය කරන්නේ කෙසේද
, අඛණ්ඩව රේඛා වාරණ ගැලපෙන නිසා එය ඔබ නැති බව විය හැක
පවා ඔබ සොයන දේ සොයා ගැනීමට අවශ්ය \ n. GNU sed
අනුවාදය 3.02.80 දැන් මෙම වාක්‍ය ඛණ්ඩයට සහය දක්වයි:

  sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           

සාම්ප්‍රදායික '/ මෙතැන් සිට /, / එතැනට / {... range' පරාසයේ
ලිපින වලට අමතරව, \ n භාවිතය සම්පූර්ණයෙන්ම වළක්වා ගත හැකිය.


7
trහොඳ අදහසක් වූ අතර, ඔබේ සමස්ත ආවරණය ඉහළ ගුණාත්මක පිළිතුරක් ලබා දෙයි.
නිව් ඇලෙක්සැන්ඩ්‍රියා

1
භාවිතා කිරීම සඳහා +1 ( සම්මත උපයෝගීතාව ) paste... සහ අනෙක් සියල්ලම!
ටෝටර්

1
@elgalu මෙය උත්සාහ කරන්න unix.stackexchange.com/questions/4527/…
hdorio

4
මෙම පිළිතුරේ ඇති හොඳම කොටස නම් විධානය ක්‍රියාත්මක වන්නේ කෙසේද සහ ඇයි යන්න “දිගු පිළිතුර” මගින් පැහැදිලි කරයි.
pdwalker

4
Stackexchange හි මා කියවා ඇති පිළිතුරු දහස් ගණනින් මෙය වඩාත් ප්‍රයෝජනවත් විය හැකිය. මට පේළි හරහා අක්ෂර කිහිපයක් ගැලපීමට අවශ්‍යයි. බහු-රේඛා ආවරණය කර ඇති පෙර සෙඩ් උදාහරණ කිසිවක් නොමැති අතර tr ට බහු අක්ෂර ගැලපීම් හැසිරවිය නොහැක. පර්ල් හොඳ පෙනුමක් ඇති නමුත් මම බලාපොරොත්තු වන පරිදි ක්‍රියා නොකරයි. මට හැකි නම් මම මෙම පිළිතුර කිහිප වතාවක්ම ඡන්දය දෙමි.
mightypile

226

කෙටි අවුල් විකල්පයක්:

awk 1 ORS=' '

පැහැදිලි කිරීම

අවුල් සහගත වැඩසටහනක් කොන්දේසි සහිත කේත-බ්ලොක් වලින් සමන්විත නීති වලින් සමන්විත වේ, එනම්:

condition { code-block }

කේත-වාරණය මඟ හැරී ඇත්නම්, පෙරනිමිය භාවිතා වේ : { print $0 }. මේ අනුව, 1මෙය සත්‍ය කොන්දේසියක් ලෙස අර්ථකථනය කර print $0එක් එක් පේළිය සඳහා ක්‍රියාත්මක වේ.

විට awkආදාන කියවන එහි වටිනාකම මත පදනම් වූ වාර්තා බවට නෙමේ RS(වාර්තා වූ ෙවන්), පෙරනිමි විසින් නව පේළියකට යොමු කිරීමේ අක්ෂරය වන, මේ අනුව, awkපෙරනිමියෙන් ආදාන පෙළ නැණවත් විග්රහ කළ ඇත. බෙදීම ද RSආදාන වාර්තාවෙන් ඉවත් කිරීම ද ඇතුළත් වේ .

දැන්, වාර්තාවක් මුද්‍රණය කරන විට, ORS(ප්‍රතිදාන වාර්තා බෙදුම්කරු) එයට එකතු කර ඇති විට, පෙරනිමිය නැවතත් නව රේඛාවක් වේ. එබැවින් ORSඅවකාශයකට වෙනස් කිරීමෙන් සියලු නව රේඛා අවකාශයට වෙනස් වේ.


5
අනෙක් අයට වඩා කියවිය හැකි මෙම සරල විසඳුමට මම ගොඩක් කැමතියි
ෆෙඩීර් රයික්ටික්

8
එය වඩාත් අර්ථවත් නම්, මෙය effectively awk 'BEGIN { ORS=" " } { print $0 } END { print "\n"} ' file.txtලදායී ලෙස මෙසේ ලිවිය හැකිය: (ආරම්භය / අවසානය නිදර්ශනය කිරීම සඳහා අවසන් නව රේඛාවක් එක් කිරීම); "1" true(රේඛාව සැකසීම) සහ print(රේඛාව මුද්‍රණය කිරීම) ඇගයීමට ලක් කරයි . මෙම ප්‍රකාශනයට කොන්දේසියක් ද එකතු කළ හැකිය, උදා: රටාවකට ගැලපෙන රේඛා මත පමණක් ක්‍රියා කිරීම: awk 'BEGIN { ORS=" " } /pattern/ { print $0 } END { print "\n"} '
මයිකල්

2
ඔබට එය වඩාත් සරල ලෙස කළ හැකිය: codeawk 'ORS = "" file.txtcode
Udi

අවාසනාවකට මෙන්, ගොනුවේ අවසාන පේළිය ද මකා දමනු ලැබේ. 'Cat' | වැනි උපසිරැසියක 'tr' භාවිතා කිරීම පිළිබඳ ඉහත පැට්‍රික් අඳුරු පිළිතුර බලන්න echo $ (tr "\ 012" "") `එය උපක්‍රමය කරයි. නිෆ්ටි.
බර්නි රයිටර්

147

gnu sed හි -zශුන්‍ය වෙන් කළ වාර්තා (රේඛා) සඳහා විකල්පයක් ඇත. ඔබට ඇමතිය හැකිය:

sed -z 's/\n/ /g'

5
ආදානයේ ශුන්‍යයන් තිබුණත්, ඒවා සුරැකෙනු ඇත (වාර්තාගත පරිසීමක ලෙස).
ටෝබි ස්පයිට්

6
ශුන්‍යයක් නොමැති නම් මෙය සම්පූර්ණ ආදානය පටවන්නේ නැද්ද? මෙම අවස්ථාවේදී බහු ගිගාබයිට් ගොනුවක් සැකසීම බිඳ වැටිය හැකිය.
රුස්ලාන්

4
Us රුස්ලාන්, ඔව් එය සම්පූර්ණ ආදානය පටවයි. මෙම විසඳුම බහු ගිගාබයිට් ගොනු සඳහා හොඳ අදහසක් නොවේ.
JJoao

11
මෙය බරපතලම හොඳම පිළිතුරයි. අනෙක් ප්‍රකාශන මතක තබා ගැනීමට නොහැකි තරම්ය. @JJoao ඔබට එය භාවිතා කළ හැකිය -u, --unbuffered. මෙම manmage මෙසේ සඳහන් වෙනවා: "බොහෝ විට ප්රතිදානය අවරෝධක ආදාන ගොනු හා භූමි මට්ටමේ සිට දත්ත අවම ප්රමාණයක් පූරණය".
not2qubit

1
Us රුස්ලාන් ඔබට බහු-ගිගාබයිට් පෙළ ගොනුවක් තිබේ නම් sed, sedවිශාල ආදානය මත කරදරකාරී මන්දගාමී වන පරිදි, රේඛීය පාදක මාදිලියේ වුවද භාවිතා කිරීමට ඔබට අවශ්‍ය නැත .
වොග්

87

මෙම perl බසට ලං අනුවාදය ඔබ බලාපොරොත්තු වන ආකාරයෙන් ක්රියා කරයි.

perl -i -p -e 's/\n//' file

අදහස් දැක්වීමේදී පෙන්වා දී ඇති පරිදි, මෙය සංස්කරණයන් ක්‍රියාත්මක වන බව සඳහන් කිරීම වටී. -i.bakඔබේ සාමාන්‍ය ප්‍රකාශනය ඔබ සිතූ තරම් බුද්ධිමත් නොවන්නේ නම් ප්‍රතිස්ථාපනය කිරීමට පෙර මුල් ගොනුවේ උපස්ථයක් ඔබට ලබා දෙනු ඇත .


23
කරුණාකර අවම වශයෙන් සඳහන් -iකරන්න උපසර්ගයක් නොමැතිව උපස්ථයක් නොමැති බව . -i.bakපහසු, කැත වැරැද්දකින් ඔබව ආරක්ෂා කරයි (කියන්න, ටයිප් කිරීමට අමතක කිරීම -pසහ ගොනුව ශුන්‍ය කිරීම).
ටෙලිමචස්

6
Le ටෙලමචස්: එය සාධාරණ කරුණක්, නමුත් එය දෙයාකාරයෙන්ම තර්ක කළ හැකිය. මා එය සඳහන් නොකිරීමට ප්‍රධාන හේතුව වන්නේ OP හි ප්‍රශ්නයේ sed උදාහරණය උපස්ථ සෑදීම නොවන නිසා එය මෙහි අතිරික්තයක් ලෙස පෙනේ. අනෙක් හේතුව නම්, මම කිසි විටෙකත් උපස්ථ ක්‍රියාකාරිත්වය භාවිතා නොකිරීමයි (ඇත්ත වශයෙන්ම ස්වයංක්‍රීය උපස්ථ කරදරකාරී බව මට පෙනේ), එබැවින් එය එහි ඇති බව මට සැමවිටම අමතක වේ. තුන්වන හේතුව නම් එය මගේ විධාන රේඛාව අක්ෂර හතරක් දිගු කිරීමයි. වඩා හොඳ හෝ නරක සඳහා (බොහෝ විට නරක), මම අනිවාර්ය අවමවාදියෙක්; මම කැමතියි සංක්ෂිප්තයට. මම තේරුම් ගත්තා ඔබ එකඟ නොවන බව. අනාගතයේදී උපස්ථ ගැන අනතුරු ඇඟවීමට මතක තබා ගැනීමට මම උපරිම උත්සාහයක් දරමි.
ire_and_curses

6
ReIre_and_curses: ඇත්තටම, ඔබ මාව නොසලකා හැරීම ගැන හොඳ තර්කයක් ඉදිරිපත් කළා. එනම්, ඔබේ තේරීම් සඳහා ඔබට හේතු ඇති අතර, මම තේරීම් සමඟ එකඟ වුවත් නැතත්, මම නිසැකවම එයට ගරු කරමි. ඒ මන්දැයි මට සම්පුර්ණයෙන්ම විශ්වාස නැත, නමුත් මම මෑතකදී මෙම විශේෂිත දෙය ගැන කඳුළු සලමින් සිටිමි ( -iඋපසර්ගයක් නොමැතිව පර්ල්හි ධජය). මට විශ්වාසයි මම ඉක්මනින්ම උමතු වීමට තවත් දෙයක් සොයා ගනීවි. :)
ටෙලිමචස්

-ගොනු නාමයක් සඳහන් කිරීමෙන් මෙය stdin සමඟ ක්‍රියා නොකිරීම ඇත්තෙන්ම අවාසනාවකි . එය කිරීමට ක්‍රමයක් තිබේද? ගොනුවක් වෙනස් කිරීම ගැන කරදර නොවී සිටීමට මගේ මාර්ගය එයයි බළලාගෙන් ආරම්භ වන නල මාර්ගයක්.
ස්ටීවන් ලූ

ගොනු නාමයන් සපයා නොමැති නම් ස්ටීවන්ලු පර්ල් පෙරනිමියෙන් STDIN වෙතින් කියවනු ඇත. ඔබ උදා කරන්න පුළුවන් ඒ නිසාperl -i -p -e 's/\n//' < infile > outfile
ire_and_curses

45

කාටද අවශ්‍ය sed? මෙන්න bashමාර්ගය:

cat test.txt |  while read line; do echo -n "$line "; done

2
ඉහළට, මම සාමාන්‍යයෙන් ඉහළම පිළිතුර භාවිතා කළෙමි, නමුත් එය හරහා / dev / urandom නල කරන විට, EOF තෙක් sed මුද්‍රණය නොකෙරේ, සහ ^ C යනු EOF නොවේ. මෙම විසඳුම නව රේඛාවක් දකින සෑම අවස්ථාවකම මුද්‍රණය කරයි. මට අවශ්‍ය දේ හරියටම! ස්තූතියි!
වාසිලී ෂරපොව්

1
එසේ නොවන්නේ ඇයි: echo -n `cat days.txt` මෙම තනතුරෙන්
ටෝනි

9
Ony ටෝනි නිසා බැක්ටික්ස් අතහැර දමා බළලා අතිරික්තය ;-) භාවිතා කරන්න: echo $ (<days.txt)
seumasmac

11
භාවිතා නොකර cat: while read line; do echo -n "$line "; done < test.txt. උප කවචයක් ගැටළුවක් නම් ප්‍රයෝජනවත් විය හැකිය.
කාලෝ කැනස්

5
echo $(<file)නව රේඛා පමණක් නොව, සියලු අවකාශය තනි අවකාශයකට මිරිකා ගනී: මෙය OP ඉල්ලා සිටින දෙයින් ඔබ්බට යයි.
ග්ලෙන් ජැක්මන්

27

සම්පූර්ණ ගොනුවම මතකයට කියවීමකින් තොරව, සියලු නව රේඛා අවදි භාවිතා කරමින් අවකාශයන් වෙනුවට ආදේශ කිරීම සඳහා:

awk '{printf "%s ", $0}' inputfile

ඔබට අවසාන නව රේඛාවක් අවශ්‍ය නම්:

awk '{printf "%s ", $0} END {printf "\n"}' inputfile

ඔබට අවකාශය හැර වෙනත් අක්ෂරයක් භාවිතා කළ හැකිය:

awk '{printf "%s|", $0} END {printf "\n"}' inputfile

END{ print ""}පසුපසින් එන නව රේඛාවක් සඳහා කෙටි විකල්පයකි.
අයිසැක්


21

කරුණු තුනක්.

  1. tr(හෝ cat, ආදිය) නියත වශයෙන්ම අවශ්‍ය නොවේ. (GNU) sedසහ (GNU) awkඒකාබද්ධ කළ විට ඔබට අවශ්‍ය ඕනෑම පෙළ සැකසුම් වලින් 99.9% ක් කළ හැකිය.

  2. ධාරාව! = රේඛාව පදනම් කරගත්. edරේඛීය පාදක සංස්කාරකයකි. sedනැත. වෙනස පිළිබඳ වැඩි විස්තර සඳහා sed දේශනය බලන්න . බොහෝ අය sedරේඛා පදනම් කර ගැනීමට ව්‍යාකූල වන්නේ එය පෙරනිමියෙන් සරල ගැලපීම් සඳහා එහි රටා ගැලපීමට එතරම් කෑදර නොවන බැවිනි - නිදසුනක් ලෙස, රටා සෙවීමේදී සහ අක්ෂර එකක් හෝ දෙකකින් ප්‍රතිස්ථාපනය කිරීමේදී, පෙරනිමියෙන් එය ප්‍රතිස්ථාපනය කරන්නේ පළමු තරගය පමණි එය සොයා ගනී (ගෝලීය විධානය මගින් වෙනත් ආකාරයකින් දක්වා නොමැති නම්). එය එක් වරකට රේඛා පමණක් තක්සේරු කරන බැවින් එය STREAM මත පදනම් වූ රේඛා මත පදනම් වූවක් නම් ගෝලීය විධානයක් පවා නොතිබෙනු ඇත. ධාවනය කිරීමට උත්සාහ කරන්න ed; ඔබ වෙනස දකිනු ඇත. edඔබට විශේෂිත රේඛා හරහා (ලූපයක් සඳහා වැනි) නැවත කියවීමට අවශ්‍ය නම් එය ඉතා ප්‍රයෝජනවත් වේ, නමුත් බොහෝ විට ඔබට අවශ්‍ය වනු sedඇත.

  3. එය කියමින්,

    sed -e '{:q;N;s/\n/ /g;t q}' file
    

    GNU sedඅනුවාදය 4.2.1 හි හොඳින් ක්‍රියා කරයි . ඉහත විධානය මඟින් සියලු නව රේඛා අවකාශයන් සමඟ ප්‍රතිස්ථාපනය වේ. එය ටයිප් කිරීමට කැත සහ ටිකක් කරදරකාරී ය, නමුත් එය හොඳින් ක්‍රියාත්මක වේ. මෙම {}පමණක් සාමය හේතු ඇතුළත් කරනවා ලෙස ගේ, වාමාංශික කළ හැක.


5
ප්රමාණවත් තරම් පමණක් දන්නා පුද්ගලයෙකු ලෙස sedමූලික දේ කරන්න, මම එය ඔබට දේ ගැන වඩා වැඩියෙන් කියන්න ඇති කළ හැකි සමග sedඑය මත යන්නේ කුමක් අවබෝධ කිරීම කොතරම් පහසු වෙනුවට,. මට වැඩ කිරීමට ඉතා අසීරු කාලයක් ඇත, sedඑබැවින් මට එය භාවිතා කළ හැකි විට වඩාත් සරල විධානයකට කැමැත්තෙමි.
නේට්

t qකොන්දේසි සහිත පැනීම ලෙස භාවිතා කරමින් මෙය s/\n / /සම්පූර්ණ ගොනුව මතකයට කියවීමකින් තොරව (අවකාශයකින් ආරම්භ වන සියලුම රේඛාවලට සම්බන්ධ වීමට) වැනි රටාවක් සමඟ ක්‍රියා කරයි . බහු මෙගාබයිට් ගොනු පරිවර්තනය කිරීමේදී පහසුය.
පෙළ පොත

ඔබ සම්බන්ධ කර ඇති ලිපිය ඔබ පවසන දේ පිළිබිඹු නොකරයි
hek2mgl

1
මෙය විශාල ආදානය මත පිළිගත් පිළිතුරට වඩා 800 ගුණයකින් මන්දගාමී වේ. මෙයට හේතුව වඩ වඩාත් විශාල ආදානය මත සෑම පේළියක් සඳහාම ආදේශකයක් ධාවනය කිරීමයි.
Thor

13

පිළිතුර: ලේබලයක් ...

Sed භාවිතා කරමින් නව රේඛාවක් (\ n) ප්‍රතිස්ථාපනය කරන්නේ කෙසේද?

... විධාන රේඛාවේ freebsd 7.2 හි ක්‍රියා නොකරයි:

(echo foo; echo bar) | sed ': a; N; $! ba; s / \ n / / g'
sed: 1: ": a; N; $! ba; s / \ n / / g": භාවිතයට නොගත් ලේබලය 'a; N; $! ba; s / \ n / / g'
foo
තීරුව

නමුත් ඔබ sed ස්ක්‍රිප්ට් එක ගොනුවකට දැමුවහොත් හෝ -e භාවිතා කර sed ස්ක්‍රිප්ට් "ගොඩනඟන්න" ...

> (echo foo; echo bar) | sed -e: a -e N -e '$! ba' -e 's / \ n / / g'
foo bar

හෝ ...

> cat > x.sed << eof
:a
N
$!ba
s/\n/ /g
eof

> (echo foo; echo bar) | sed -f x.sed
foo bar

සමහර විට OS X හි ඇති sed එක සමාන විය හැකිය.


එම්කේඑස් භාවිතා කරමින් කවුළු මත -e තර්ක මාලාව මා වෙනුවෙන් වැඩ කළේය! ස්තූතියි!
ජේම්ස් ජී

12

තේරුම් ගැනීමට පහසු විසඳුම

මට මේ ගැටලුව තිබුණා. පයින් ගැසීම යනු මට BSD (Mac OS X) සහ GNU හි (ලිනක්ස් සහ සිග්වින් ) වැඩ කිරීමට විසඳුම අවශ්‍ය වූ sedඅතර tr:

$ echo 'foo
bar
baz


foo2
bar2
baz2' \
| tr '\n' '\000' \
| sed 's:\x00\x00.*:\n:g' \
| tr '\000' '\n'

ප්‍රතිදානය:

foo
bar
baz

(පසුපස නව රේඛාවක් ඇත)

එය ලිනක්ස්, ඕඑස් එක්ස් සහ බීඑස්ඩී මත ක්‍රියා කරයි - යූටීඑෆ් -8 සහය නොමැතිව හෝ කපටි පර්යන්තයක් සමඟ වුවද.

  1. trවෙනත් අක්ෂරයක් සමඟ නව රේඛාව මාරු කිරීමට භාවිතා කරන්න .

    NULL( \000හෝ \x00) හොඳයි, එයට යූටීඑෆ් -8 සහාය අවශ්‍ය නොවන අතර එය භාවිතා කිරීමට ඉඩක් නැත.

  2. භාවිතා sedවන ගැලපෙනNULL

  3. trඔබට අවශ්‍ය නම් අමතර නව රේඛා ආපසු මාරු කිරීමට භාවිතා කරන්න


1
නාමකරණය පිළිබඳ සියුම් සටහන: චරිතය \000ලෙස පොදුවේ සඳහන් කරනු ලැබේ NUL(එක් උසස් පෙළ), සහ NULLඑය zero- ගැන කතා කරන විට සාමාන්යයෙන් භාවිතා කරන්නක් බවට (C / C ++).
sqweek


9

මම විශේෂ expert යෙක් නොවෙමි, නමුත් මම සිතන්නේ sedඔබ මුලින්ම ඊළඟ පේළිය රටා අවකාශයට එකතු කළ යුතු බවයි N. මෙම කොටස "Multiline රටාව අභ්යවකාශ" සිට පොතේ "උසස් විධාන sed" තුළ sed සහ awk (ඩේල් ඩොහර්ටි සහ ආර්නෝල්ඩ් රොබින්ස්, O'Reilly 1997; 107 පිටුව පෙරදසුන ):

Multiline Next (N) විධානය මඟින් නව ආදාන පේළියක් කියවා රටා අවකාශයේ අන්තර්ගතයට එකතු කිරීමෙන් බහු රටා රටා අවකාශයක් නිර්මාණය කරයි. රටා අවකාශයේ මුල් අන්තර්ගතය සහ නව ආදාන රේඛාව නව රේඛාවකින් වෙන් කරනු ලැබේ. කාවැද්දූ නව රේඛා අක්‍ෂරය "\ n" ගැලවීමේ අනුක්‍රමය මඟින් රටාවන්ට ගැලපේ. බහුවිධ රටා අවකාශයක, මෙටාචරැක්ටර් "^" රටා අවකාශයේ පළමු අක්‍ෂරයට ගැලපේ, නමුත් කාවැද්දූ නව රේඛා (ය) අනුගමනය කරන අක්ෂර (ය) නොවේ. ඒ හා සමානව, "$" ගැලපෙන්නේ රටා අවකාශයේ අවසාන නව රේඛාවට පමණක් වන අතර කාවැද්දූ නව රේඛා (ය) සමඟ නොගැලපේ. ඊලඟ විධානය ක්‍රියාත්මක කිරීමෙන් පසුව, ස්ක්‍රිප්ටයේ ඊළඟ විධානයන්ට පාලනය ලබා දෙනු ලැබේ.

සිට man sed:

[2addr] එන්

එකතු කළ ද්‍රව්‍ය මුල් අන්තර්ගතයෙන් වෙන් කිරීම සඳහා කාවැද්දූ නව රේඛා අක්ෂරයක් භාවිතා කරමින් රටා අවකාශයට ඊළඟ ආදාන පේළිය එකතු කරන්න. වත්මන් රේඛා අංකය වෙනස් වන බව සලකන්න.

නරක ලෙස හැඩගස්වා ඇති ලොග් ලිපිගොනු සෙවීම සඳහා මම මෙය භාවිතා කර ඇති අතර, සෙවුම් දාමය "අනාථ" ඊළඟ පේළියක සොයාගත හැකිය.


7

මම දෙමුහුන් ප්‍රවේශයක් භාවිතා කර නව රේඛාව වටා ගමන් කිරීම සඳහා tr භාවිතා කරමින් නව රේඛා ටැබ් වෙනුවට ආදේශ කර, පසුව ටැබ් වෙනුවට මට අවශ්‍ය ඕනෑම දෙයක් ආදේශ කරමි. මෙම අවස්ථාවේ දී, "
" මම HTML බිඳීම් ජනනය කිරීමට උත්සාහ කරන බැවින්.

echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`

6

ඉහත "tr" විසඳුමට ප්‍රතිචාර වශයෙන්, වින්ඩෝස් හි (බොහෝ විට tr හි Gnuwin32 අනුවාදය භාවිතා කරයි), යෝජිත විසඳුම:

tr '\n' ' ' < input

මා වෙනුවෙන් වැඩ නොකිරීම, එය දෝෂයක් හෝ කිසියම් හේතුවක් නිසා ඇත්ත වශයෙන්ම \ nw / '' වෙනුවට ආදේශ කරයි.

Tr හි තවත් අංගයක් භාවිතා කරමින් -d "මකන්න" විකල්පය ක්‍රියාත්මක වුවද:

tr -d '\n' < input

හෝ '\ n' වෙනුවට '\ r \ n'


3
වින්ඩෝස් හි, ඔබ බොහෝ විට භාවිතා කිරීමට අවශ්ය වේ tr "\n" " " < input. වින්ඩෝස් කවචය (cmd.exe) අපෝස්තලාපය උපුටා දැක්වීමේ චරිතයක් ලෙස සලකන්නේ නැත.
කීත් තොම්සන්

නැත, වින්ඩෝස් 10 උබුන්ටු උප පද්ධතියේ, ඔබ භාවිතා කළ යුතුයtr "\n\r" " " < input.txt > output.txt
user1491819

මෙය වින්ඩෝස් 10 හි Gnuwin32 භාවිතා කරයි : cat SourceFile.txt | tr --delete '\r\n' > OutputFile.txt. නැතහොත්, Gnuwin32 වෙනුවට, Gow (Windows හි Gnu) භාවිතා කරන්න, github.com/bmatzelle/gow/wiki
Alchemistmatt

6

මා සමඟ සරල විසඳුමක් සොයා නොගත්තේ ඇයි awk?

awk '{printf $0}' file

printf මුල් පේළි අවකාශයක් හෝ වෙනත් ආකාරයකින් වෙන් කිරීමට ඔබට අවශ්‍ය නම්, නව රේඛා නොමැතිව සෑම පේළියක්ම මුද්‍රණය කරනු ඇත:

awk '{printf $0 " "}' file

echo "1\n2\n3" | awk '{printf $0}', මෙය මට වැඩ කරයි. @ edi9999
Itachi

කවුළු සඳහා git bash තුළ මා වෙනුවෙන් වැඩ කළ එකම ප්‍රවේශය මෙයයි
ප්ලේටෝ

5

වෙඩි නොවදින විසඳුම. ද්විමය-දත්ත-ආරක්ෂිත සහ POSIX- අනුකූල, නමුත් මන්දගාමී ය.

POSIX sed ගොනුවට සහ POSIX රේඛාවට අනුව ආදානය අවශ්‍ය වේ අර්ථ දැක්වීම් , එබැවින් NULL- බයිට් සහ දිගු රේඛා වලට ඉඩ නොදෙන අතර සෑම පේළියක්ම නව රේඛාවකින් අවසන් විය යුතුය (අවසාන පේළිය ඇතුළුව). අත්තනෝමතික ආදාන දත්ත සැකසීම සඳහා sed භාවිතා කිරීම මෙය දුෂ්කර කරයි.

පහත දැක්වෙන විසඳුම sed එකෙන් වැළකී ඒ වෙනුවට ආදාන බයිට් අෂ්ට කේත බවට පරිවර්තනය කර නැවත බයිට් බවට පරිවර්තනය කරයි, නමුත් අෂ්ටක කේතය 012 (නව රේඛාව) වලට බාධා කර ඒ වෙනුවට ආදේශන නූල ප්‍රතිදානය කරයි. මට කිව හැකි තාක් දුරට විසඳුම POSIX- අනුකූල වේ, එබැවින් එය විවිධාකාර වේදිකාවල වැඩ කළ යුතුය.

od -A n -t o1 -v | tr ' \t' '\n\n' | grep . |
  while read x; do [ "0$x" -eq 012 ] && printf '<br>\n' || printf "\\$x"; done

POSIX යොමු ලේඛනය: sh , shell විධාන භාෂාව , od , tr , grep , read , [ , printf .

දෙකම read, [හාprintf අවම වශයෙන් බාෂ් වලින් සාදන ලද නමුත් එය බොහෝ විට පොසික්ස් විසින් සහතික කර නොමැති නිසා සමහර වේදිකාවල එක් එක් ආදාන බයිට් නව ක්‍රියාවලි එකක් හෝ කිහිපයක් ආරම්භ කරනු ඇත, එමඟින් දේවල් මන්දගාමී වේ. බාෂ් වලදී පවා මෙම ද්‍රාවණය 50 kB / s පමණ වේ, එබැවින් එය විශාල ලිපිගොනු සඳහා සුදුසු නොවේ.

උබුන්ටු (බාෂ්, ඩෑෂ් සහ කාර්යබහුල පෙට්ටිය), ෆ්‍රීබීඑස්ඩී සහ ඕපන්බීඑස්ඩී මත පරීක්ෂා කර ඇත.


5

සමහර අවස්ථා වලදී ඔබට RSවෙනත් නූලකට හෝ අක්ෂරයකට වෙනස් විය හැකිය . මේ ආකාරයෙන්, / n උප / gsub සඳහා ලබා ගත හැකිය:

$ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file

ෂෙල් ස්ක්‍රිප්ටින්හි බලය නම්, ඔබ එය එක් ආකාරයකින් කරන්නේ කෙසේදැයි නොදන්නේ නම් ඔබට එය වෙනත් ආකාරයකින් කළ හැකිය. සරල ගැටළුවකට සංකීර්ණ විසඳුමක් ලබා දීමට වඩා බොහෝ විට ඔබට සැලකිල්ලට ගත යුතු බොහෝ දේ ඇත.

උකුස්සා මන්දගාමී වන කාරණය සම්බන්ධයෙන් ... සහ ගොනුව මතකයට කියවන විට, මම මෙය නොදනිමි, නමුත් මට නම්, ඒ අවස්ථාවේ එක් පේළියක් සමඟ වැඩ කරන බවක් පෙනේ. එය ඉතා වේගවත්ය (අනෙක් සමහරක් තරම් වේගවත් නොවේ , නමුත් ලිවීමට හා පරීක්ෂා කිරීමට ගතවන කාලය ද ගණන් කරයි).

මම MB සහ GB දත්ත පවා සකසන අතර මා සොයාගත් එකම සීමාව රේඛීය ප්‍රමාණයයි.


5

වින්ඩෝස් රේඛා අවසානයන් සමඟ කටයුතු කිරීමට තරම් ඔබ අවාසනාවන්ත නම් \rසහ ඉවත් කිරීමට අවශ්‍ය වේ\n

tr '\r\n' ' ' < $input > $output

මෙම මෘදුකාංගය වෙනුවට [හිස්තැනක්, සහ \rහිස්තැනක්, සහ \nහිස්තැනක්, සහ ]හිස්තැනක්. tr -d '\r\n' <fileඕනෑම \rහෝ \nඅක්ෂර ඉවත් කරනු ඇත , නමුත් එය අසනු ලබන්නේ ද නොවේ. tr -d '\r' <fileඕනෑම \rචරිතයක් (ඒවා යාබදව තිබේද යන්න නොසලකා) ඉවත් කිරීමට ඉඩ \nඇති අතර එය බොහෝ විට ප්‍රයෝජනවත් වීමට වඩා සමීප වන අතර OP හි අවශ්‍යතාවයට බෙහෙවින් නිවැරදි විය හැකිය (තවමත් ඔබ trමෙම පසුගාමී අංකනය තේරුම් ගෙන ඇතැයි උපකල්පනය කරයි ).
ත්‍රිත්ව

ස්තූතියි, එය සවි කර ඇත. [] නොතබන්න, සහ tr නව රේඛාවක් ලෙස නැවත පැමිණේ. tr නොමැති පද්ධති තිබේද?
StevenWernerCS

ඔවුන් මේ දිනවල සර්ව සම්පූර්ණයි, නමුත් මම හිතන්නේ ඒවා ක්‍රියාත්මක නොවූ පද්ධති මට මතක ඇති (HP-UX සහ AIX සහ Irix වැනි ඩයිනෝසෝරයන් සමහර විට?)
ත්‍රිත්ව

4

ඔබට භාවිතා කළ හැකිය xargs- එය \nපෙරනිමියෙන් අවකාශයක් සමඟ ප්‍රතිස්ථාපනය වේ.

කෙසේ වෙතත්, ඔබේ ආදානයට කිසියම් සිද්ධියක් තිබේ නම් එය ගැටළු ඇති කරයි unterminated quote, උදා: දී ඇති රේඛාවක උපුටා දැක්වීමේ ලකුණු නොගැලපේ නම්.


xargs ද අවසාන පේළිය මනාව හසුරුවයි:
AAAfarmclub

4

ඉඩ දීම භාවිතා කර සොයා ගනී

sed -ie -z 's/Marker\n/# Marker Comment\nMarker\n/g' myfile.txt

මාකර්

බවට පත්වේ

# සලකුණු සටහන

මාකර්


3

මැක් ඕඑස් එක්ස් හි (ෆ්‍රීබීඑස්ඩී සෙඩ් භාවිතා කරමින්):

# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta

3

හිස් රේඛා ඉවත් කිරීමට:

sed -n "s/^$//;t;p;"

මෙය GNU Sed සඳහා ය. සාමාන්‍ය සෙඩ් වලදී මෙය ලබා දෙයි sed: 1: "s/^$//;t;p;": undefined label ';p;'.
Léo Léopold Hertz 준영

3

අවුල් භාවිතා කිරීම:

awk "BEGIN { o=\"\" }  { o=o \" \" \$0 }  END { print o; }"

2
ඔබ පිටත ඒවා තනි මිල ගණන් වලට වෙනස් කරන්නේ නම්, උද්ධෘත ලකුණු සහ ඩොලර් ලකුණෙන් ගැලවීමට ඔබට අවශ්‍ය නැත. "O" අක්ෂරය සාමාන්‍යයෙන් විචල්ය නාමයක් ලෙස නරක තේරීමක් ලෙස සලකනු ලබන්නේ එය "0" ඉලක්කම් සමඟ පටලවා ගත හැකි බැවිනි. ඔබේ විචල්‍යය ආරම්භ කිරීමටද ඔබට අවශ්‍ය නැත, එය පෙරනිමිය ශුන්‍ය නූලකට. කෙසේ වෙතත්, ඔබට බාහිර ප්‍රමුඛ ඉඩක් අවශ්‍ය නොවන්නේ නම් : awk '{s = s sp $0; sp = " "} END {print s}'. කෙසේ වෙතත්, මුළු ගොනුවම මතකයට කියවීමකින් තොරව අවදි භාවිතා කිරීමේ ක්‍රමයක් සඳහා මගේ පිළිතුර බලන්න.
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

කරුණාකර පරීක්ෂා තෝර් පිළිතුර වෙනුවට. මෙම ප්‍රවේශය සංසන්දනය කිරීම වඩා කාර්යක්ෂම, කියවිය හැකි සහ වඩා හොඳ ක්‍රමයකි (මෙය ක්‍රියාත්මක වුවද )!
mschilli

මචන්, මට තේරුණා. එය මගේ මුහුණට අතුල්ලන්න අවශ්‍ය නැත :-) තෝර්ගේ පිළිතුර කෙසේ හෝ පිටුවේ ඉහළින් තිබේ (එය හරි), එබැවින් ඔබ සැලකිලිමත් වන්නේ කුමක් ද?
kralyk

3

මම විශේෂයෙන් කැමති විසඳුමක් නම් රැඳවුම් අවකාශයේ ඇති සියලුම ලිපිගොනු එකතු කර ගොනුව අවසානයේ සියලු නව රේඛා ආදේශ කිරීමයි:

$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar

කෙසේ වෙතත්, කවුරුහරි මට කිව්වා සමහර ක්‍රියාත්මක කිරීම් වලදී රඳවා තබා ගැනීමේ ඉඩ සීමිත විය හැකිය.


1
ඔබේ පිළිතුරේ හිස් නූලක් ආදේශ කිරීමෙන් සැඟවෙන්නේ සැඟවුණු අවකාශයට එකතු කිරීම සඳහා සෑම විටම H භාවිතා කිරීම යන්නෙන් අදහස් වන්නේ රඳවා ගැනීමේ අවකාශය නව රේඛාවකින් ආරම්භ වන බවයි. මෙය වළක්වා ගැනීම සඳහා, ඔබ භාවිතා කළ යුතුය1h;2,$H;${x;s/\n/x/g;p}
ජෙෆ්

3

ඕනෑම පේළියකින් නව රේඛා ප්‍රතිස්ථාපනය කර අවසන් නව රේඛාවද ප්‍රතිස්ථාපනය කරන්න

පිරිසිදු trවිසඳුම් ආදේශ කළ හැක්කේ තනි අක්‍ෂරයකින් පමණක් වන අතර පිරිසිදු sedවිසඳුම් මඟින් ආදානයේ අවසාන නව රේඛාව ප්‍රතිස්ථාපනය නොකරයි. පහත දැක්වෙන විසඳුම මෙම ගැටළු නිරාකරණය කරන අතර ද්විමය දත්ත සඳහා ආරක්ෂිත බව පෙනේ (UTF-8 පෙදෙසක් සමඟ වුවද):

printf '1\n2\n3\n' |
  sed 's/%/%p/g;s/@/%a/g' | tr '\n' @ | sed 's/@/<br>/g;s/%a/@/g;s/%p/%/g'

ප්‍රති ult ලය:

1<br>2<br>3<br>

මෙය නරක ය, මන්ද එය අඩංගු ඕනෑම ආදානයක අනවශ්‍ය ප්‍රතිදානයක් ලබා දෙනු ඇත@
ස්ටීවන් ලූ

Te ස්ටීවන්ලූ: නැත, @ආදානයේ හරි. එය %aනැවත නැවතත් පැන යයි. විසඳුම සම්පුර්ණයෙන්ම POSIX අනුකූල නොවිය හැක (NULL- බයිට් ද්විමය දත්ත සඳහා එතරම් හොඳ නොවන අතර සියලු රේඛා නව රේඛාවකින් අවසන් විය යුතුය, එවිට trප්‍රතිදානය ඇත්ත වශයෙන්ම වලංගු නොවේ).
Honkon A. Hjortland

අහ්. මට පේනවා ඔයා ඒක හදලා තියෙනවා කියලා. සරල මෙහෙයුමක් විය යුතු දේ සඳහා කරුණාවන්ත විය, නමුත් හොඳ වැඩකි.
ස්ටීවන් ලූ

3

එය ඇත sed "සාමාන්ය" ආදේශන පසු නව-රේඛා හඳුන්වා දෙයි බව. පළමුව, එය නව රේඛා වර්‍ගය කපා දමයි, පසුව එය ඔබේ උපදෙස් අනුව ක්‍රියා කරයි, පසුව එය නව රේඛාවක් හඳුන්වා දෙයි.

භාවිතා sed ඔබ මාර්ගය "අවසානය" (නෑ නව රේඛා කටු) කපා හරින ලදැයි කිරීමෙන් පසු, ඔබ කැමති වැලක් සමග, එක් එක් ආදාන මාර්ගය සඳහා වෙනුවට හැක; නමුත්, sed විවිධ රේඛා ප්‍රතිදානය කරයි. උදාහරණයක් ලෙස, ඔබට "පේළියේ අවසානය" "===" සමඟ ආදේශ කිරීමට අවශ්‍ය යැයි සිතමු (තනි ඉඩක් වෙනුවට ආදේශ කිරීමට වඩා සාමාන්‍යය):

PROMPT~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
PROMPT~$

නව රේඛා වර්‍ගය නූල් සමඟ ප්‍රතිස්ථාපනය කිරීම සඳහා, ඔබට අකාර්යක්ෂම ලෙස, පෙර පෙන්වා දුන් පරිදි tr භාවිතා කළ හැකිය, නව රේඛා-අක්ෂර “විශේෂ වර්‍ගයක්” සමඟ ප්‍රතිස්ථාපනය කර, පසුව එම විශේෂ වර්‍ගය ඔබට අවශ්‍ය නූලෙන් ආදේශ කිරීමට sed භාවිතා කරන්න. .

උදාහරණයක් වශයෙන්:

PROMPT~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===PROMPT~$

3

ඔබට මෙම ක්‍රමය ද භාවිතා කළ හැකිය

sed 'x;G;1!h;s/\n/ /g;$!d'

පැහැදිලි කිරීම

x   - which is used to exchange the data from both space (pattern and hold).
G   - which is used to append the data from hold space to pattern space.
h   - which is used to copy the pattern space to hold space.
1!h - During first line won't copy pattern space to hold space due to \n is
      available in pattern space.
$!d - Clear the pattern space every time before getting next line until the
      last line.

ප්‍රවාහය:
පළමු පේළිය ආදානයෙන් ලබා ගත් විට, හුවමාරුව සිදු වේ, එබැවින් 1 අවකාශය රඳවා ගැනීමට ගොස් pattern n රටා අවකාශයට පැමිණ, පසුව රඳවා ගැනීමේ ඉඩ රටා අවකාශයට එකතු කර, පසුව ආදේශනය සිදු කර රටා අවකාශය මකා දමයි.
දෙවන පේළි හුවමාරුව සිදු කරන විට, 2 අවකාශය රඳවා ගැනීමට යන අතර 1 රටා අවකාශයට පැමිණ, පසුව රටා අවකාශයට Gරඳවා ගැනීමේ ඉඩ එකතු කරන්න, ඉන්පසු hරටාව එයට පිටපත් කර ආදේශනය කර මකා දමනු ලැබේ. Eof වෙත ළඟා වන තෙක් මෙම මෙහෙයුම දිගටම කරගෙන ගොස් නිශ්චිත ප්‍රති .ලය මුද්‍රණය කරන්න.


කෙසේ වෙතත්, එහි ප්‍රති that echo 'Y' | sed 'x;G;1!h;s/\n/X/g;$!d'ලයක් ලෙස අනතුරු අඟවන්න XY.
ස්පූකි

3

තවත් GNU sed ක්‍රමයක්, Zsolt Botykai ගේ පිළිතුරට බොහෝ දුරට සමාන ය , නමුත් මෙය sedනිතර නිතර භාවිතා වන y( අක්ෂර පරිවර්තනය ) විධානයක් භාවිතා කරයි, එමඟින් එක් බයිට් කේතයක් ඉතිරි වේ (පසුපසින් g):

sed ':a;N;$!ba;y/\n/ /'

යමෙකු බලාපොරොත්තු yවන්නේ වඩා වේගයෙන් ධාවනය වනු ඇතැයි s(සමහර විට trවේගයෙන් 20x වේගයෙන්), නමුත් GNU sed v4.2.2 y හි 4% ට වඩා මන්දගාමී වේ s.


වඩා අතේ ගෙන යා හැකි BSD sed අනුවාදය:

sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'

2
BSD sed සමඟ yca 15% වේගවත් වේ. වැඩ කරන උදාහරණයක් සඳහා මෙම පිළිතුර බලන්න .
Thor

එසේම, BSD sed විධාන ලේබලයකින් පසුව අවසන් sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'කළ යුතුය , එබැවින් යා යුතු මාර්ගය වනු ඇත.
ghoti
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.