Як ввести спеціальний символ нового рядка у файл за допомогою команди echo та оператора перенаправлення?


29

Я хотів би створити файл за допомогою команди echo та оператора перенаправлення, при цьому файл повинен складатися з кількох рядків.

Я намагався включити новий рядок через "\ n" всередині рядка:

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

але таким чином не створюється файл із трьома рядками, а файл із лише одним рядком та дослівним вмістом рядка.

Як я можу створити лише за допомогою цієї команди файл з кількома рядками?


Відповіді:


30

Ви попросили використовувати якийсь синтаксис із echoкомандою:

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

(Але врахуйте і іншу відповідь, яку ви отримали.)

У $'...'конструкт розширюється вбудовані керуючі послідовності ANSI.


1
Зауважте, що це не POSIX, чи він доступний багато в чому залежить від того, яку оболонку ви використовуєте.
Кріс Даун

1
Ви знаходите цю конструкцію у видатних оболонках (принаймні), ksh, bash, zsh (а може й інших).
Яніс

1
@ChrisDown, це ще не POSIX, але він запланований для включення у випуск 8. ksh93, bash, zsh, mksh, FreeBSD sh підтримують його.
Стефан Шазелас

24

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

З відлунням, яке надає GNU bash (як вбудований), та деякими іншими варіантами ехо, ви можете зробити щось на зразок наступного:

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

Я спробував вашу кішку> файл << '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, яку друкує оболонка, коли ви вводите неповну команду (наприклад, у цьому випадку команда з незрівнянним символом цитати).


0

POSIX 7 говорить, що ви не можете

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

-e не визначено і зворотні косої риски визначено реалізацією:

Якщо перший операнд дорівнює -n, або якщо будь-який з операндів містить символ <зворотний штрих>, результати визначаються реалізацією.

якщо у вас немає додаткового розширення XSI

Тож використовуйте printfзамість цього:

Операнд формату використовуватиметься як рядок формату, описаний у нотації про формат XBD [...]

Формат файлу нотація :

\ n <новий рядок> Перемістіть позицію друку до початку наступного рядка.

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

  • вбудований Bash: help echo
  • автономний виконуваний файл: which echo

що може призвести до певної плутанини.


Буде echoвбудований кожен кожух, наявний у системі. У Ubuntu / bin / sh зазвичай тире, bash також надходить за замовчуванням. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... усі вони матимуть власне відлуння з різною поведінкою. Зауважте, що which echoце не дасть вам шляху відлуння системи у всіх оболонках.
Стефан Шазелас

@ StéphaneChazelas "яке відлуння не дасть вам шляху системного відлуння у всіх оболонках". Що я не знав, що ще це може дати?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Спробуйте в tcsh або zsh. whichспочатку (у 80-х роках) був скриптом csh лише для користувачів csh (завантажений псевдоніми від ~ / .cshrc) і все ще є в деяких системах. whichє вбудованим в zsh і tcsh.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.