Использование 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?

Амелио Васкес-Рейна
источник
2
stackoverflow.com/questions/1251999/…
Марк МакКинстри

Ответы:

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
pferor
источник
1
spongeполезная утилита для перезаписи входного файла Это часть пакета moreutils... например. awk '$1=$1' ORS=' ' file |sponge file
Peter.O
@ferer Спасибо за информацию. Установка moreutils...
pferor
5

Вы можете попробовать использовать trвместо этого:

echo "$string" | tr '\n' ' '
Марк Маккинстри
источник
4

Еще один вариант будет использовать xargs(который, кроме того, сжимает несколько пробелов):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test
user57553
источник
3

Эхо игнорирует пробелы, поэтому должно работать:

new_string=`echo $string`
Kevin
источник
Да, это будет работать, но, возможно, слишком хорошо. Это свернет несколько пробелов в один пробел. Это включает преобразование вкладок в пробелы.
Peter.O
3

Если у вас уже есть строка в качестве переменной Баш, как ваш пример показывает, что это бессмысленно и расточительно ресурсов (и более типирования) для вызова sed, awk, printfи т.д. ... Вы можете просто использовать расширение Баш переменной :

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

Вам даже не нужно переназначать его. Вы можете использовать расширение как есть и оставить $stringбез изменений.

printf "${string//$'\n'/ }" >file
Peter.O
источник
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>.

mikeserv
источник
0

Вы можете использовать простую команду sed

 $-sed ':loop;N;s/\n/ /g;t loop'
Каланидхи М.
источник