Как вставить специальный символ новой строки в файл с помощью команды echo и оператора перенаправления?

29

Я хотел бы создать файл с помощью команды echo и оператора перенаправления, файл должен состоять из нескольких строк.

Я попытался включить новую строку "\ n" внутри строки:

echo "first line\nsecond line\nthirdline\n" > foo

но таким образом не создается файл с тремя строками, а файл с одной строкой и дословным содержанием строки.

Как я могу создать с помощью этой команды файл с несколькими строками?

Абдул Аль Хазред
источник
stackoverflow.com/questions/8467424/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

30

Вы просили использовать некоторый синтаксис с echoкомандой:

echo $'first line\nsecond line\nthirdline' > foo

(Но подумайте и о другом ответе, который вы получили.)

В $'...'конструкт расширяется встроенные управляющие последовательности ANSI.

Janis
источник
1
Обратите внимание, что это не POSIX, то, будет ли он доступен, во многом зависит от того, какую оболочку вы используете.
Крис Даун
1
Вы найдете эту конструкцию в видных оболочках (по крайней мере), ksh, bash, zsh (и, возможно, в других).
Янис
1
@ChrisDown, это еще не POSIX, но его планируется включить в выпуск 8. ksh93, bash, zsh, mksh, FreeBSD sh поддерживают его.
Стефан Шазелас
24

То, что echo делает с символьными escape-символами, определяется реализацией. Во многих реализациях echo (в том числе в большинстве современных) передаваемая строка по умолчанию вообще не проверяется на выход.

С помощью echo, предоставляемого GNU bash (как встроенного), и некоторых других вариантов echo, вы можете сделать что-то вроде следующего:

echo -en 'first line\nsecond line\nthird line\n' > file

Тем не менее, это действительно звучит так, как вы хотите printf, что на мой взгляд более разборчиво и более переносимо (эта функция определена в POSIX):

printf '%s\n' 'first line' 'second line' 'third line' > file

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

cat > file << 'EOF'
first line
second line
third line
EOF
Крис Даун
источник
я попробовал ваш cat> file << 'EOF' в оболочке, и когда я нажал enter, я получил это> приглашение в форме с каждой строкой, но я не мог выйти из него, даже нажав ctrl + x или ctrl + z
Абдул Аль Хазред
Вы должны вводить EOF в одну строку ввода ...
Rmano
2
@mikeserv Ты шутлив или серьезен?
Мэтью Читал
1
@AbdulAlHazred, как указывает ссылка в ответе, называется «документ здесь» и встречается очень часто. Википедия хороша в этой теме: en.wikipedia.org/wiki/Here_document .
dave_thompson_085
1
Это сработало для моего Mac OSX (в частности echo -en 'text..', в то время как принятый ответ не распознал мой символ новой строки ( \n), это было echo -enсделано)
benjaminmgross
4

Вот несколько других способов создания многострочного файла с помощью echoкоманды:

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

где вторая и третья команды используют >>оператор перенаправления, который приводит к тому, что выходные данные команды добавляются (добавляются) к файлу (который уже должен существовать к этому моменту).

Или

(echo "first line"; echo "second line"; echo "third line") > foo

где круглые скобки объединяют echoкоманды в один подпроцесс, который выглядит и действует как любая отдельная программа, которая выводит несколько строк (например ls, например).

Тонкая вариация на выше

{ echo "first line"; echo "second line"; echo "third line";} > foo

Это немного более эффективно, чем второй ответ, поскольку он не создает подпроцесс. Тем не менее, синтаксис немного сложнее: обратите внимание, что вы должны иметь пробел после {и точку с запятой перед }.

См. Каковы операторы управления и перенаправления оболочки? за дополнительной информацией.

Скотт
источник
2

Чтобы дать еще один вариант, вы можете просто нажать Enter (т.е. буквальный перевод строки):

$ echo "the rain in spain
> falls mainly on the plain" > foo

Обратите внимание, что вы не вводите >в начале второй строки. Это приглашение вторичной оболочки $PS2, которое печатает оболочка при вводе неполной команды (например, в этом случае, команда с непревзойденным символом кавычки).

gardenhead
источник
0

POSIX 7 говорит, что вы не можете

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e не определяется, и обратные слэши определяются реализацией:

Если первый операнд -n или любой из операндов содержит символ <backslash>, результаты определяются реализацией.

если у вас нет дополнительного расширения XSI.

Так что используйте printfвместо:

операнд формата должен использоваться как строка формата, описанная в нотации формата файла XBD [...]

обозначение формата файла :

\ n <newline> Переместите позицию печати в начало следующей строки.

Также имейте в виду, что Ubuntu 15.10 и большинство дистрибутивов реализуют echoкак:

  • встроенный в Bash: help echo
  • автономный исполняемый файл: which echo

что может привести к некоторой путанице.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
В echoкаждой оболочке, доступной в системе, будет встроен встроенный модуль. В Ubuntu / bin / sh обычно dash, bash также поставляется по умолчанию. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... будут иметь свое собственное эхо с различным поведением. Обратите внимание, что which echoэто не даст вам пути системного эха во всех оболочках.
Стефан Шазелас
@ StéphaneChazelas "эхо не даст вам пути эха системы во всех оболочках". Что я не знал, что еще это могло дать?
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件
Попробуйте в tcsh или zsh. whichПервоначально (в 80-х годах) был сценарием csh только для пользователей csh (загружал псевдонимы из ~ / .cshrc) и до сих пор используется в некоторых системах. whichявляется встроенным в Zsh и TSCH.
Стефан Шазелас