3

Я пытаюсь завершить строку с \ и добавить что-то еще на новую строку. Сначала я сделал это, но он просто печатает \n:

$ echo -e "Test\\\nNewline" 
Test\nNewline

Я пробовал таким образом, но после обратной косой черты добавляется пробел:

$ echo -e "Test\\ \nNewline"
Test\ 
Newline

Как я могу это сделать, чтобы после \?

ОБНОВЛЕНИЕ: Теперь нет проблем, так как я вижу, что добавление еще двух слешей дает желаемый результат. Но мне все еще интересно, почему это так?

$ echo -e "Test\\\\\nNewline"
Test\
Newline

2 ответа2

2

Стивен уже объяснил, почему так много обратной косой черты необходимо; Я хотел бы перечислить некоторые, возможно, лучшие способы сделать то же самое. Во-первых, использование одинарных кавычек вместо двойных кавычек пропускает дополнительный уровень интерпретации / удаления escape:

$ echo -e "Test\\\nNewline"
Test\nNewline
$ echo -e 'Test\\\nNewline'
Test\
Newline

Во-вторых, я не рекомендую использовать echo для подобных вещей, поскольку разные его версии ведут себя совершенно по-разному: некоторые интерпретируют escape-последовательности в строке (например, \n) даже без опции -e , некоторые выводят «-e» как часть их вывода и т. д. Вот пример использования /bin /echo вместо встроенной версии bash:

$ /bin/echo -e 'Test\\\nNewline'
-e Test\\\nNewline

...Это на OS X v10.10.4; это может отличаться в вашей ОС и / или версии. В любое время, когда вам нужно предсказуемое поведение с escape-интерпретацией и / или без финального перевода строки, я рекомендую printf вместо echo . Это немного сложнее: первый аргумент для printf - это строка формата, в которой экранирование всегда интерпретируется, и это также может включать % последовательностей, которые будут использоваться для добавления в оставшиеся аргументы (в которых экранированные последовательности не интерпретируются), Кроме того, printf автоматически не добавляет перевод строки в конце, вы должны включить это явно. Вот несколько способов напечатать то, что вы хотите с помощью printf:

$ printf 'Test\\\nNewline\n'    # note explicit final newline
Test\
Newline
$ printf '%s\n' 'Test\' 'Newline'    # Escape is interpreted in the format string, but not in the second argument
Test\
Newline
2

Справочное руководство Bash: Двойные кавычки: в двойных кавычках удаляются обратные слэши, за которыми следует один из этих символов [включая обратную косую черту].

Поэтому "Test\\\\\nNewline" заменяется на « Test\\nNewline перед передачей в качестве параметра команде echo .

Чтобы продемонстрировать это:

$ echo -e "Test\\\\\nNewline"
Test\
Newline

$ echo -e 'Test\\\nNewline'
Test\
Newline

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