Używanie sed do konwertowania nowych linii na spacje


22

Powiedzmy, że mam zmienną powłoki, $stringktóra zawiera tekst z kilkoma znakami nowej linii, np .:

string="this
is 
a test"

Chciałbym przekonwertować ten ciąg na nowy, w new_stringktórym wszystkie podziały wierszy są konwertowane na spacje:

new_string="this is a test"

Próbowałem:

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

ale to nie zadziałało

Zastanawiam się także, czy istnieje sposób, aby to zrobić za pomocą, perl -0777 's/\n/ /g'a może polecenia tr?


Odpowiedzi:


32

Jeśli chcesz tylko usunąć nowe linie w ciągu, nie musisz go używać sed. Możesz użyć tylko

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

jak wskazali inni.

Ale jeśli chcesz przekonwertować nowe linie na spacje w pliku za pomocą sed, możesz użyć:

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

a nawet awk:

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

1
spongejest użytecznym narzędziem do nadpisywania pliku wejściowego. Jest częścią pakietu moreutils... np. awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer Dziękujemy za informację. Instalowanie moreutils...
pferor


4

Jeszcze inną opcją byłoby użycie xargs(która dodatkowo wyciska wiele białych znaków):

string="this
    is 
a    test"

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

3

Echo ignoruje białe znaki, więc powinno działać:

new_string=`echo $string`

Tak, zadziała, ale być może zbyt dobrze. Zwija wiele białych znaków do pojedynczej spacji. Obejmuje to przekształcanie tablic TAB w spacje.
Peter.O

3

Jeśli masz już ciąg jako zmienną bash, jak Twoje przykład pokazuje, że nie ma sensu i marnotrawstwo zasobów (i więcej typowania) zadzwonić sed, awk, printfitd ... Można po prostu użyć bash ekspansji zmiennej :

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

Nie musisz nawet przypisywać go ponownie. Możesz użyć rozszerzenia w obecnej postaci i pozostawić $stringbez zmian.

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

3

Możesz także wypróbować to polecenie awk,

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

Przykład:

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

Konwertuje to dowolną sekwencję jednego lub więcej \nznaków ewline występujących w zmiennej powłoki $stringna jedną <space>.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.