экранирование новой строки в строке замены sed - PullRequest
21 голосов
/ 24 января 2012

Вот мои попытки заменить b символ новой строкой, используя sed во время выполнения bash

$> echo 'abc' | sed 's/b/\n/'
anc

нет, это не так

$> echo 'abc' | sed 's/b/\\n/'
a\nc

нет, это тоже не так. Я хочу получить вывод

a
c

HELP!

Ответы [ 5 ]

14 голосов
/ 24 января 2012

Похоже, вы находитесь на BSD или Solaris.Попробуйте это:

[jaypal:~/Temp] echo 'abc' | sed 's/b/\ 
> /'
a
c

Добавьте черную косую черту и нажмите ввод и завершите свой оператор sed.

3 голосов
/ 16 июля 2015
$ echo 'abc' | sed 's/b/\'$'\n''/'
a
c

В Bash $'\n' расширяется до символа новой строки, заключенного в кавычки (см. Раздел «QUOTING» в man bash). Три строки объединяются перед передачей в sed в качестве аргумента. Sed требует экранирования символа новой строки, отсюда и первая обратная косая черта в вставленном мною коде.

3 голосов
/ 24 января 2012

Вы не сказали, что хотите глобально заменить все b . Если да, вы хотите tr вместо:

$ echo abcbd | tr b $'\n'
a
c
d

У меня работает на Solaris 5.8 и bash 2.03

0 голосов
/ 13 августа 2016

В многострочном файле мне пришлось передать через tr по обе стороны от sed, вот так:

echo "$FILE_CONTENTS" | \ tr '\n' ¥ | tr ' ' ∑ | mySedFunction $1 | tr ¥ '\n' | tr ∑ ' '

Видите, Unix любит вырезать новые строки, лишние пробелы и все виды вещей, потому что я думаю, что это было то, что нужно было делать в то время, когда это было сделано еще в 1900-х годах. Во всяком случае, этот метод, который я показываю выше, решает проблему на 100%. Хотел бы я, чтобы кто-то опубликовал это где-нибудь, потому что это спасло бы меня примерно на три часа моей жизни.

0 голосов
/ 24 января 2012
echo 'abc' | sed 's/b/\'\n'/' 

вы пропали без вести '' вокруг \n

...