ฉันสับสนกับ GNU sed
, POSIX sed
และsed
ตัวเลือกมากมายของBSD ฉันจะแทนที่ตัวอักษร\n
ด้วยอักขระขึ้นบรรทัดใหม่โดยใช้ทั้งสามsed
ประเภทได้อย่างไร
foo\\nbar
หรือfoo\\\nbar
?
ฉันสับสนกับ GNU sed
, POSIX sed
และsed
ตัวเลือกมากมายของBSD ฉันจะแทนที่ตัวอักษร\n
ด้วยอักขระขึ้นบรรทัดใหม่โดยใช้ทั้งสามsed
ประเภทได้อย่างไร
foo\\nbar
หรือfoo\\\nbar
?
คำตอบ:
sed 's/\\n/\
/g'
สังเกตว่าแบ็กสแลชก่อนที่จะกดปุ่มย้อนกลับในสตริงการแทนที่
sed
คำสั่งดั้งเดิมใน Unix v7 ในปี 1979 สถานที่เดียวที่อาจไม่สามารถใช้งานได้นั้นคือ POSIX ที่ไม่ได้ใช้งานที่ไม่ได้ใช้งานsed
เช่นเดียวกับคนอื่น ๆ ที่ไม่ทำงานใน csh แต่มันเป็นปัญหา csh
\\n
ใช้ในส่วนการค้นหาทำไมไม่ใช้\n
ในการแทนที่ อดีตดูเหมือนจะบ่งบอกถึงหลังที่มีอยู่ กล่าวคือ ทำไมไม่เป็นเช่นนั้น$ echo '1\n2'|sed 's/\\n/\n/g'
\n
นี้เป็นตัวอักษรซึ่งหมายความว่ามันจะปรากฏเป็นตัวละครทั้งสอง: abackslash ตามด้วยn
และไม่เป็นตัวอักษรขึ้นบรรทัดใหม่เดียว ดังนั้นแบ็กสแลชสองตัวที่ใช้แบ็กสแลชที่แท้จริงแล้วn
เนื่องจากคุณมีsed
คำตอบแบบพกพาอยู่แล้วฉันจะพูดถึงว่าsed
มันไม่ค่อยเป็นเครื่องมือที่ดีที่สุดถ้าคุณต้องการจัดการกับการขึ้นบรรทัดใหม่ Perl นั้นเกือบพกพาsed
ติดตั้งได้ตามค่าเริ่มต้นในระบบ nix ส่วนใหญ่และสามารถจัดการกับสิ่งนี้ได้อย่างง่ายดาย:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
อีกทางเลือกที่พกพามากคือawk
:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
บน Solaris อย่าลืมใช้ awk มาตรฐานใน / usr / xpg4 / bin หนึ่งใน / bin เป็นอันเก่าแก่และไม่ควรใช้สำหรับสคริปต์ใหม่
awk
มีปัญหาที่คล้ายกันพกพา (คือของฉันawk
เก่าธรรมดาawk
, nawk
หรือgawk
?) ที่จริงรุ่นในกล่อง Solaris gsub()
ของฉันขาด คะแนนของฉันที่นี่มีไว้สำหรับ Perl ( perl -nlawe '...'
ประมาณพฤติกรรมอัตโนมัติของawk
)
awk
พกพาติดกับรุ่นawk
ที่เป็นไปตาม POSIX และใช้คุณสมบัติเหล่านั้นเท่านั้นและคุณควรจะใช้ได้ บน Solaris /usr/xpg4/bin/awk
คุณจะพบหนึ่ง
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
ล่ะ?
gsub()
ควรทำงานได้ทุกที่ แม้ busybox awk
มี
หากH
oldspace ว่างเปล่าคุณสามารถทำได้:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... แต่คำตอบของ uxnutนั้นมีทั้งเร็วและง่ายกว่าอยู่แล้วดังนั้นคุณจึงสามารถทำได้ตามที่ต้องการ
ความเป็นไปได้ภายนอกอื่น:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
แต่ระวัง ^ ที่แปล\
เครื่องหมายแบ็กสแลชสไตล์ C ทั้งหมด- เช่น\b
ackspace \r
และ\00
eturn และ octals และ whathaveyou
ด้วยgnu sed
ต่อไปนี้ยังใช้งานได้:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
คุณต้องมีวิธีการแก้ปัญหาใน sed และที่ได้รับด้านล่าง แต่ฉันต้องการเพิ่มความเป็นไปได้อีกอย่างที่ IMHO นั้นง่ายขึ้นและเร็วขึ้น
tr -d "\n"