-1

Я пытаюсь добавить новую строку, используя sed , она работает только тогда, когда я добавляю новую строку следующим образом: \\\n:

echo "sometextutf8_filesystemmmmm" | sed -r "/utf8_filesystem/a \\\n# Passive mode"

выход:

sometextutf8_filesystemmmmm

# Passive mode

Одна или две косые черты не работают! С одной \n или двумя \\n косой чертой я просто получаю следующий вывод:

sometextutf8_filesystemmmmm
n# Passive mode

без новой строки.

Даже при том, что это работает должным образом без трех обратных слешей с заменой:

echo "sometextutf8_filesystemmmmm" | sed -r "s/utf8_filesystem/\n# Passive mode/"

Выход:

sometext
# Passive modemmmm

Может ли кто-нибудь объяснить такое поведение?

2 ответа2

0

Я не могу воспроизвести вашу проблему, используя bash.

$ echo aaa | sed -r 's/aaa/AAA \n#Passive mode/'
AAA
#Passive mode

$ myprog=sed

$ echo aaa | $myprog -r "s/aaa/AAA \n#Passive mode/"
AAA
#Passive mode

поэтому я подозреваю, что в этом есть нечто большее, чем указано в вопросе.


Это наверное потому что

1) у вас, вероятно, есть какой-то сложный набор сценариев и / или псевдонимов и / или переменных среды, которые приводят к тому, что ваши аргументы оцениваются несколько раз, и

2) вы используете неверный тип кавычек. Когда вы используете "Params" оболочка будет обрабатывать экранирование, преобразуя \\ в \ .

Вы можете быть счастливее, используя одинарные кавычки: 'params'

сравнить

$ echo "s/aaa/AAA \\\n#BBB/"
s/aaa/AAA \\n#BBB/

$ echo 's/aaa/AAA \\\n#BBB/'
s/aaa/AAA \\\n#BBB/
-1

Вы должны использовать одну цитату. Когда вы используете двойные кавычки, специальные символы не воспринимаются буквально, поэтому всякий раз, когда вы используете обратную косую черту, вы должны пропустить ее с другой обратной косой чертой. Когда вы используете одинарные кавычки, все воспринимается буквально, чтобы не пропускать специальные символы «пробелы, знаки доллара ... и т.д.».

Вы можете зайти в Google, чтобы узнать больше о различиях между одинарными и двойными кавычками в оболочке Linux Bourne-Again.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .