Використання 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
Пітер.O

@ferer Дякую за інформацію. Встановлення moreutils...
pferor


4

Ще одним варіантом буде використання xargs(яке, крім того, видавлює кілька пробілів):

string="this
    is 
a    test"

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

3

Echo ігнорує простір білого, тому воно має працювати:

new_string=`echo $string`

Так, це спрацює, але, можливо, занадто добре. Він згортає багато пробілів до єдиного простору. Це включає перетворення табличних таблиць у пробіли.
Пітер.О

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.