ใช้ sed เพื่อแปลงบรรทัดใหม่เป็นช่องว่าง


22

ว่าฉันมีตัวแปรเชลล์$stringที่เก็บข้อความที่มีบรรทัดใหม่หลายบรรทัดเช่น:

string="this
is 
a test"

ฉันต้องการแปลงสตริงนี้เป็นสตริงใหม่new_stringที่การแบ่งบรรทัดทั้งหมดถูกแปลงเป็นช่องว่าง:

new_string="this is a test"

ฉันเหนื่อย:

print $string | sed 's/\n/ /g'

แต่มันไม่ทำงาน

ฉันยังสงสัยว่ามีวิธีการทำเช่นนี้โดยใช้ perl -0777 's/\n/ /g'หรืออาจคำสั่งtr?


คำตอบ:


32

sedถ้าคุณต้องการที่จะลบเส้นใหม่ในสตริงคุณไม่จำเป็นต้องใช้ คุณสามารถใช้เพียง

$  echo "$string" | tr '\n' ' '

เหมือนคนอื่น ๆ

แต่ถ้าคุณต้องการแปลงบรรทัดใหม่เป็นช่องว่างในไฟล์โดยใช้sedคุณสามารถใช้:

$ sed -i ':a;N;$!ba;s/\n/\t/g' file_with_line_breaks

หรือแม้กระทั่งawk:

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces

1
spongeเป็นเครื่องมือที่มีประโยชน์สำหรับการเขียนทับไฟล์อินพุต มันเป็นส่วนหนึ่งของแพ็คเกจmoreutils... เช่น awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer ขอบคุณสำหรับข้อมูล กำลังติดตั้งmoreutils...
pferor


4

อีกตัวเลือกหนึ่งก็คือการใช้xargs(ซึ่งนอกจากนี้บีบพื้นที่สีขาวหลายแห่ง):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test

3

Echo ไม่สนใจพื้นที่สีขาวดังนั้นจึงควรใช้งาน:

new_string=`echo $string`

ใช่มันใช้งานได้แต่อาจจะดีเกินไป มันจะยุบช่องว่างหลายแห่งไปยังพื้นที่เดียว ซึ่งรวมถึงการแปลง TABs เป็นช่องว่าง
Peter.O

3

หากคุณมีสตริงเป็นตัวแปรทุบตีเป็นแสดงให้เห็นตัวอย่างของคุณก็จะไม่มีจุดหมายและสิ้นเปลืองทรัพยากร (และการพิมพ์มากขึ้น) เพื่อเรียกsed, awk, printfฯลฯ ... คุณสามารถใช้เพียงการขยายตัวตัวแปรทุบตี :

string="${string//$'\n'/ }"

คุณไม่จำเป็นต้องกำหนดซ้ำ คุณสามารถใช้การขยายตามที่เป็นและ$stringไม่เปลี่ยนแปลง

printf "${string//$'\n'/ }" >file

3

คุณสามารถลองใช้คำสั่ง awk นี้ได้เช่นกัน

awk -v RS="" '{gsub (/\n/," ")}1' file

ตัวอย่าง:

$ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1'
This is a test.

1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

แปลงนี้ลำดับหนึ่งหรือหลาย ๆ\nตัวละคร ewline ที่เกิดขึ้นในตัวแปรเปลือกเป็นหนึ่ง$string<space>


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.