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


Ответы:


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

1
spongeполезная утилита для перезаписи входного файла Это часть пакета moreutils... например. awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer Спасибо за информацию. Установка moreutils...
pferor


4

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

string="this
    is 
a    test"

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

3

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

new_string=`echo $string`

Да, это будет работать, но, возможно, слишком хорошо. Это свернет несколько пробелов в один пробел. Это включает преобразование вкладок в пробелы.
Peter.O

3

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

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

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

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

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>.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.