it-roy-ru.com

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

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

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

нет не то

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

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

a
c

ПОМОГИТЕ!

21
spraff

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

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

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

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

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

3
tboyce12

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

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

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

3
glenn jackman

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

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

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

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

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

0
Ravi Bhatt