Menggunakan sed untuk mengubah baris baru menjadi spasi


22

Katakanlah saya memiliki variabel shell $stringyang menampung beberapa teks dengan beberapa baris baru, misalnya:

string="this
is 
a test"

Saya ingin mengubah string ini menjadi string baru di new_stringmana semua jeda baris dikonversi menjadi spasi:

new_string="this is a test"

Saya mencoba:

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

tapi itu tidak berhasil

Saya juga bertanya-tanya apakah ada cara melakukan ini menggunakan perl -0777 's/\n/ /g'atau mungkin perintah tr?


Jawaban:


32

Jika Anda hanya ingin menghapus baris baru dalam string, Anda tidak perlu menggunakan sed. Anda bisa menggunakan saja

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

seperti yang orang lain tunjukkan.

Tetapi jika Anda ingin mengonversi baris baru menjadi spasi di file menggunakan sed, maka Anda dapat menggunakan:

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

atau bahkan awk:

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

1
spongeadalah utilitas yang berguna untuk menimpa file input. Itu adalah bagian dari paket moreutils... mis. awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer Terima kasih atas informasinya. Memasang moreutils...
pferor


4

Namun pilihan lain adalah menggunakan xargs(yang, di samping itu, memeras banyak ruang putih):

string="this
    is 
a    test"

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

3

Echo mengabaikan ruang putih, jadi itu seharusnya bekerja:

new_string=`echo $string`

Ya, itu akan berhasil, tetapi mungkin terlalu baik. Ini akan menutup multi spasi putih menjadi satu ruang tunggal. Itu termasuk mengkonversi TAB ke spasi.
Peter.O

3

Jika Anda sudah memiliki string sebagai variabel bash, sebagai contoh menunjukkan Anda, itu adalah sia-sia dan boros sumber daya (dan lebih mengetik) untuk memanggil sed, awk, printf, dll ... Anda dapat hanya menggunakan variabel ekspansi pesta :

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

Anda bahkan tidak perlu menetapkan ulang. Anda dapat menggunakan ekspansi apa adanya, dan biarkan $stringtidak berubah.

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

3

Anda dapat mencoba perintah awk ini juga,

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

Contoh:

$ (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"

Ini mengonversi urutan apa pun dari satu atau beberapa \nkarakter baris baru yang terjadi dalam variabel shell $stringmenjadi satu <space>.


0

Anda dapat menggunakan perintah sed sederhana

 $-sed ':loop;N;s/\n/ /g;t loop'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.