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?

Amelio Vazquez-Reina
sumber

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
pferor
sumber
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
5

Anda dapat mencoba menggunakan trsebagai gantinya:

echo "$string" | tr '\n' ' '
Mark McKinstry
sumber
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
pengguna57553
sumber
3

Echo mengabaikan ruang putih, jadi itu seharusnya bekerja:

new_string=`echo $string`
Kevin
sumber
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
Peter.O
sumber
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.
Avinash Raj
sumber
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>.

mikeserv
sumber
0

Anda dapat menggunakan perintah sed sederhana

 $-sed ':loop;N;s/\n/ /g;t loop'
Kalanidhi M.
sumber