Yeni satırları boşluklara dönüştürmek için sed kullanma


22

Diyelim ki $stringbazı metinleri birkaç yeni satır içeren bir kabuk değişkenim var, örneğin:

string="this
is 
a test"

Bu dizgiyi new_stringtüm satır sonlarının boşluklara dönüştürüldüğü yeni bir dizgeye dönüştürmek istiyorum:

new_string="this is a test"

Denedim:

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

ama işe yaramadı

Bunu kullanarak bunu yapmanın bir yolu perl -0777 's/\n/ /g'ya da belki komutu olup olmadığını merak ediyorum tr?


Yanıtlar:


32

Yalnızca dizedeki yeni satırları kaldırmak istiyorsanız, kullanmanız gerekmez sed. Sadece kullanabilirsiniz

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

Diğerlerinin dediği gibi.

Ancak, yeni satırları kullanarak bir dosyadaki boşluklara dönüştürmek sedistiyorsanız, şunları kullanabilirsiniz:

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

veya hatta awk:

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

1
spongeGiriş dosyasının üzerine yazmak için kullanışlı bir yardımcı programdır. Ambalajın bir parçası moreutils... ör. awk '$1=$1' ORS=' ' file |sponge file
Peter,

@ferer Bilgi için teşekkürler. Yükleme moreutils...
pferor


4

Yine bir başka seçenek de kullanmak olacaktır xargs(ek olarak çoklu boşluk sıkmak):

string="this
    is 
a    test"

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

3

Eko, beyaz boşluğu yok sayar, bu nedenle çalışması gerekir:

new_string=`echo $string`

Evet, işe yarayacak, ama belki de çok iyi. Çoklu boşlukları tek bir alana daraltacaktır. Bu, TAB'lerin boşluklara dönüştürülmesini içerir.
Peter,

3

Zaten bir bash değişkeni olarak dize varsa, örneğin gösterdiği gibi, çağrı anlamsız ve kaynakların (ve daha yazarak) israfıdır sed, awk, printf, vb ... Sadece kullanabilirsiniz bash değişken genişleme :

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

Yeniden atamak zorunda bile değilsin. Genişlemeyi olduğu gibi kullanabilir ve $stringdeğişmeden bırakabilirsiniz .

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

3

Bu awk komutunu da deneyebilirsiniz,

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

Örnek:

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

Bu \n, kabuk değişkeninde ortaya çıkan bir veya daha fazla ewline karakterinin herhangi bir sırasını teke $stringdönüştürür <space>.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.