Jak wstawić znak specjalny nowego wiersza do pliku za pomocą polecenia echo i operatora przekierowania?

29

Chciałbym utworzyć plik za pomocą polecenia echo i operatora przekierowania, plik powinien składać się z kilku wierszy.

Próbowałem dołączyć nowy ciąg przez „\ n” w ciągu:

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

ale w ten sposób nie jest tworzony plik z trzema liniami, ale plik z tylko jedną linią i dosłownie zawartością łańcucha.

Jak mogę utworzyć za pomocą tego polecenia plik z kilkoma liniami?

Abdul Al Hazred
źródło
stackoverflow.com/questions/8467424/…
Ciro Santilli 23 改造 中心 法轮功 六四 事件 事件

Odpowiedzi:

30

Poprosiłeś o użycie składni z echopoleceniem:

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

(Ale zastanów się także nad inną odpowiedzią, którą otrzymałeś).

W $'...'rozwinięciu konstrukt osadzony sekwencji sterujących ANSI.

Janis
źródło
1
Zauważ, że to nie jest POSIX, to, czy jest ono dostępne, zależy w dużej mierze od używanej powłoki.
Chris Down,
1
Znajdziesz ten konstrukt w widocznych powłokach (przynajmniej), ksh, bash, zsh (i może innych).
Janis
1
@ChrisDown, to jeszcze nie POSIX, ale planowane jest włączenie do wydania 8. ksh93, bash, zsh, mksh, FreeBSD sh obsługują to.
Stéphane Chazelas
24

To, co echo robi ze znakami ucieczki, jest zdefiniowane w implementacji. W wielu implementacjach echa (w tym w większości nowoczesnych) przekazany ciąg znaków nie jest w ogóle domyślnie sprawdzany pod kątem zmian znaczenia.

Dzięki echu dostarczonemu przez GNU bash (jako wbudowane) i niektórym innym wariantom echa, możesz zrobić coś takiego:

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

Jednak naprawdę brzmi tak, jak chcesz printf, co jest bardziej czytelne dla mojego oka, a także bardziej przenośne (ma tę funkcję zdefiniowaną przez POSIX):

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

Możesz również rozważyć użycie dokumentu tutaj :

cat > file << 'EOF'
first line
second line
third line
EOF
Chris Down
źródło
wypróbowałem twojego kota> plik << 'EOF' w powłoce, a kiedy nacisnąłem Enter, otrzymałem ten> kształt w każdym wierszu, ale nie mogłem się z niego wydostać, nawet naciskając ctrl + x lub ctrl + z
Abdul Al Hazred
Musisz wpisać EOF sam w jednym wierszu wprowadzania ...
Rmano
2
@mikeserv Czy jesteś żartobliwy czy poważny?
Mateusz
1
@AbdulAlHazred, jak wskazuje link w odpowiedzi, nazywa się to „dokumentem tutaj” i jest bardzo powszechne. Wikipedia jest dobra w tym temacie: en.wikipedia.org/wiki/Here_document .
dave_thompson_085
1
To zadziałało w moim Mac OSX (konkretnie echo -en 'text..', podczas gdy zaakceptowana odpowiedź nie rozpoznała mojego znaku nowej linii ( \n), to echo -enzrobiła.
benjaminmgross
4

Oto kilka innych sposobów tworzenia pliku wielowierszowego za pomocą echopolecenia:

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

gdzie drugie i trzecie polecenie używają >>operatora przekierowania, co powoduje dołączenie (dodanie) wyniku polecenia do pliku (który powinien już istnieć, do tego momentu).

Lub

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

gdzie nawiasy grupują echopolecenia w jeden podproces, który wygląda i działa jak każdy pojedynczy program, który generuje wiele wierszy (jak lsna przykład).

Subtelna odmiana powyższego jest

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

Jest to nieco bardziej wydajne niż druga odpowiedź, ponieważ nie tworzy podprocesu. Jednak składnia jest nieco trudniejsza: zwróć uwagę, że przed i należy wstawić spację {i średnik }.

Zobacz Jakie są operatory kontroli i przekierowania powłoki? po więcej informacji.

Scott
źródło
2

Aby dać jeszcze jedną opcję, możesz po prostu nacisnąć Enter (tj. Dosłownie nowy wiersz):

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

Zauważ, że nie wpisujesz >na początku drugiej linii. Jest to wtórny monit powłoki $PS2, który powłoka drukuje po wpisaniu niekompletnego polecenia (np. W tym przypadku polecenie z niedopasowanym znakiem cudzysłowu).

ogrodnik
źródło
0

POSIX 7 mówi, że nie możesz

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

-e nie jest zdefiniowany, a ukośniki odwrotne są zdefiniowane jako implementacja:

Jeśli pierwszym operandem jest -n lub jeśli dowolny z operandów zawiera znak <backlash>, wyniki są zdefiniowane w implementacji.

chyba że masz opcjonalne rozszerzenie XSI.

printfZamiast tego użyj :

operand formatu należy wykorzystać jako ciąg formatu opisany w notacji formatu pliku XBD [...]

Oznaczenia Format pliku :

\ n <nowa linia> Przenieś pozycję drukowania na początek następnego wiersza.

Pamiętaj również, że Ubuntu 15.10 i większość dystrybucji implementuje echooba jako:

  • wbudowane Bash: help echo
  • samodzielny plik wykonywalny: which echo

co może prowadzić do zamieszania.

Ciro Santilli
źródło
W echokażdej powłoce dostępnej w systemie będzie wbudowane. Na Ubuntu / bin / sh jest zwykle dash, bash również jest domyślnie. Zsh, rc, mksh, yash, csh, tcsh, ksh93 ... będą miały swoje własne echo z innym zachowaniem. Zauważ, że which echonie da ci ścieżki echa systemowego we wszystkich powłokach.
Stéphane Chazelas
@ StéphaneChazelas „które echo nie da ścieżki systemu we wszystkich powłokach”. Nie wiedziałem, co jeszcze może dać?
Ciro Santilli 22 改造 中心 法轮功 六四 事件
Spróbuj w tcsh lub zsh. whichbył pierwotnie (w latach 80.) skryptem csh tylko dla użytkowników csh (ładował aliasy z ~ / .cshrc) i nadal jest dostępny w niektórych systemach. whichjest wbudowany w zsh i tcsh.
Stéphane Chazelas