Как использовать замену новой строки в sed BSD? - PullRequest
18 голосов
/ 14 сентября 2009

Привет, как мне выполнить следующее в BSD sed?

sed 's/ /\n/g'

На странице руководства указано, что \ n будет обрабатываться буквально в пределах строки замены. Как мне избежать такого поведения? Есть альтернатива?

Я использую Mac OS Snow Leopard, я могу установить fink для получения GNU sed.

Ответы [ 4 ]

16 голосов
/ 14 сентября 2009

В оболочке вы можете сделать:

    sed 's/ /\
/g'

нажатие клавиши ввода после обратной косой черты для вставки новой строки

8 голосов
/ 10 ноября 2013

Другой способ:

sed -e 's/ /\'$'\n/g'

См. здесь .

5 голосов
/ 11 ноября 2013

Для простоты использования я лично часто использую

cr="\n" 
# or (depending version and OS)
cr="
"

sed "s/ /\\${cr}/g"

, поэтому он остается на 1 строке.

0 голосов
/ 06 апреля 2018

Чтобы расширить ответ @ sikmir: в Bash, который является оболочкой по умолчанию в Mac OS X, все, что вам нужно сделать, это поместить символ $ перед строкой в ​​кавычках, содержащей escape-последовательность, которую вы хотите получить интерпретированы. Bash автоматически переведет его для вас.

Например, я удалил все возвраты каретки MS-DOS из всех исходных файлов в lib/ и include/, написав:

grep -lr $'\r' lib include | xargs sed -i -e $'s/\r//'
find . -name '*-e' -delete

BSD grep сам по себе правильно интерпретировал бы '\r', но использование $'\r' не повредит.

BSD sed сам по себе неверно истолковал бы 's/\r//', но, используя $'s/\r//', я избежал этой ловушки.

Обратите внимание, что мы можем поставить $ перед всей строкой, и он позаботится обо всех escape-последовательностях во всей строке.

$ echo $'hello\b\\world'
hell\world
...