Подтвердить что ты не робот

Экранирование строк в строке замены sed

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

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

нет, что не он

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

нет, это тоже не так. Выход, который я хочу, -

a
c

HELP!

4b9b3361

Ответ 1

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

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

Добавьте черную косую черту и нажмите enter и заполните инструкцию sed.

Ответ 2

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

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

Работает для меня на Solaris 5.8 и bash 2.03

Ответ 3

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

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

Ответ 4

echo 'abc' | sed 's/b/\'\n'/' 

вам не хватает '' вокруг \n

Ответ 5

В многострочном файле мне пришлось пропустить tr по обеим сторонам sed, например:

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

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