Sed нуждается в `\\\ n`, чтобы добавить новую строку

896
Mohammed Noureldin

Я пытаюсь добавить новую строку, используя 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 

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

-1
@anubhava: `sed (GNU sed) 4.2.2` Mohammed Noureldin 6 лет назад 0
Тогда `sed -r '/ utf8_filesystem / a \\ n # Пассивный режим'` также должен работать. anubhava 6 лет назад 0
@anubhava, да, я уже попробовал это. На самом деле то, что я хочу, это объяснение. Зачем мне три или две косые черты? что я пытаюсь сбежать? Mohammed Noureldin 6 лет назад 0
Если вы хотите избежать двойного побега, используйте: `sed -r 's / utf8_filesystem / & \ n \ n # Пассивный режим /'` anubhava 6 лет назад 0
https://stackoverflow.com/questions/2369314/why-does-sed-require-3-backslashes-for-a-regular-backslash#2372693 xenoid 6 лет назад 1
@xenoid, извини, я пытался это понять, но до сих пор не ясно, можешь ли ты использовать это в моей ситуации? Так зачем мне три, а не две обратные косые черты? Два станут одним -> `\ n` -> Я бы ожидал новую строку, но это не так. это должно быть `\\\ n`, чтобы работать, почему это? или в случае использования одинарных кавычек, см. мой комментарий ниже в ответе RedGrittyBrick. Mohammed Noureldin 6 лет назад 0
Я думаю, что вам нужно три обратных слеша, потому что вы используете двойные кавычки. Таким образом, оболочка сама увидит одинарный или двойной обратный слеш и интерпретирует их. С одинарными кавычками вам нужны две обратные косые черты. Если вы попытаетесь разбить скрипт на две части, sed выведет предупреждение `sed -r -e '/ utf8_filesystem / a' -e '\ n # Пассивный режим' <<< 'одна utf8_filesystem two' sed: -e выражение # 1, символ 18: ожидается \ после 'a', 'c' или 'i'`. Посмотрите, что `info sed` говорит о командах` a`, `c` и` i`. Это то, что я понимаю о проблеме, я не знаю, правильный ли это ответ. Paulo 6 лет назад 0

2 ответа на вопрос

0
RedGrittyBrick

Я не могу воспроизвести вашу проблему, используя 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/ 
Это не неправильные кавычки, в моей реальной ситуации я передаю параметр команде `$ some_thing`, поэтому мне нужны двойные кавычки. Но я до сих пор не понимаю, зачем мне нужно `\\ n`, обычно, когда я хочу добавить новую строку, я просто использую` \ n`. Mohammed Noureldin 6 лет назад 0
в любом случае, если я использую ваш случай с одинарными кавычками: `'\\ n'`, зачем мне две косые черты? почему не только один? Mohammed Noureldin 6 лет назад 0
-1
Amjad Abdullah

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

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

это не обязательно, я хочу передать переменные `sed`, поэтому мне нужны двойные кавычки. Mohammed Noureldin 6 лет назад 0
Извините, если я что-то пропустил. Я не думаю, что это имеет значение, если вы используете одинарные или двойные кавычки с sed, если вы принимаете меры предосторожности при использовании escape-символов соответственно. Я прочитал в какой-то другой ветке (и в вашем случае это очевидно), что для выполнения вашей команды, как вы ожидаете, нужно экранировать как \, так и n. Вы можете проверить здесь: https://stackoverflow.com/questions/723157/how-to-insert-a-newline-in-front-of-a-pattern Amjad Abdullah 6 лет назад 0
На самом деле это имеет значение, вы можете прочитать это здесь https://superuser.com/questions/1249828/why-does-echo-e-some-text-show-only-one-backslash?noredirect=1&lq=1, но поведение из трех обратных косых черт все еще странно для меня. Mohammed Noureldin 6 лет назад 0
Спасибо, что указал мне на полезную ветку. Это секунды того, что я говорил, поскольку это не должно иметь значения при использовании кавычек **, если вы принимаете меры предосторожности при использовании escape-символов соответственно ** Ссылка на ваш вопрос точно отвечает вашим интересам. Я не знаю, почему у тебя все еще есть сомнения. Однако я сомневаюсь, почему есть два разных перевода: самим bash и echo, а echo - встроенная оболочка? Я предполагал, что перевод bash должен быть точно обработан с помощью echo. Но, похоже, мое предположение неверно, особенно это противоречит практическому поведению. Amjad Abdullah 6 лет назад 0

Похожие вопросы