Bagaimana cara menempatkan karakter khusus baris baru ke dalam file menggunakan perintah gema dan operator redirection?

29

Saya ingin membuat file dengan menggunakan perintah echo dan operator pengalihan, file harus dibuat dari beberapa baris.

Saya mencoba memasukkan baris baru dengan "\ n" di dalam string:

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

tetapi dengan cara ini tidak ada file dengan tiga baris dibuat tetapi file dengan hanya satu baris dan konten kata demi kata dari string.

Bagaimana saya bisa membuat hanya menggunakan perintah ini file dengan beberapa baris?

Abdul Al Hazred
sumber
stackoverflow.com/questions/8467424/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

30

Anda meminta untuk menggunakan beberapa sintaks dengan echoperintah:

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

(Tapi pertimbangkan juga jawaban lain yang Anda dapatkan.)

The $'...'mengembang membangun tertanam escape sequence ANSI.

Janis
sumber
1
Perhatikan bahwa ini bukan POSIX, apakah tersedia sebagian besar tergantung pada shell apa yang Anda gunakan.
Chris Down
1
Anda menemukan bahwa konstruksi di shell menonjol (setidaknya), ksh, bash, zsh (dan mungkin yang lain).
Janis
1
@ ChrisDown, ini belum POSIX, tetapi dijadwalkan untuk dimasukkan dalam edisi 8. ksh93, bash, zsh, mksh, FreeBSD sh mendukungnya.
Stéphane Chazelas
24

Apa yang dilakukan gema dengan pelarian karakter adalah implementasi didefinisikan. Dalam banyak implementasi gema (termasuk yang paling modern), string yang diteruskan tidak diperiksa untuk lolos sama sekali secara default.

Dengan gema yang disediakan oleh GNU bash (sebagai builtin), dan beberapa varian gema lainnya, Anda dapat melakukan sesuatu seperti berikut ini:

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

Namun, ini benar-benar terdengar seperti yang Anda inginkan printf, yang lebih mudah dibaca oleh mata saya, dan lebih portabel juga (memiliki fitur ini didefinisikan oleh POSIX):

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

Anda juga dapat mempertimbangkan untuk menggunakan dokumen di sini :

cat > file << 'EOF'
first line
second line
third line
EOF
Chris Down
sumber
saya mencoba file kucing Anda << 'EOF' di shell, dan ketika saya menekan enter, saya mendapat prompt berbentuk> ini dengan setiap baris, tetapi saya tidak bisa keluar darinya bahkan dengan menekan ctrl + x atau ctrl + z
Abdul Al Hazred
Anda harus mengetikkan EOF sendiri dalam satu jalur input ...
Rmano
2
@ mikeserv Apakah Anda sedang bercanda atau serius?
Matius Baca
1
@AbdulAlHazred sebagai tautan dalam jawaban menunjukkan, itu disebut "dokumen di sini" dan sangat umum. Wikipedia bagus dalam topik ini: en.wikipedia.org/wiki/Here_document .
dave_thompson_085
1
Ini berfungsi untuk Mac OSX saya (khususnya echo -en 'text..', sedangkan jawaban yang diterima tidak mengenali karakter baris baru saya ( \n), echo -enmemang.
benjaminmgross
4

Berikut adalah beberapa cara lain untuk membuat file multi-line menggunakan echoperintah:

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

di mana perintah kedua dan ketiga menggunakan >>operator pengalihan, yang menyebabkan output dari perintah ditambahkan (ditambahkan) ke file (yang seharusnya sudah ada, pada titik ini).

Atau

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

di mana tanda kurung mengelompokkan echoperintah ke dalam satu sub-proses, yang terlihat dan bertindak seperti program tunggal mana pun yang menghasilkan banyak baris (seperti ls, misalnya).

Variasi halus di atas adalah

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

Ini sedikit lebih efisien daripada jawaban kedua karena tidak membuat sub-proses. Namun, sintaksnya sedikit lebih rumit: perhatikan bahwa Anda harus memiliki spasi setelah {tanda titik koma dan sebelum titik koma }.

Lihat Apa saja kontrol shell dan operator redirection? untuk informasi lebih lanjut.

Scott
sumber
2

Untuk memberikan opsi lain, Anda bisa menekan Enter (yaitu, baris baru literal):

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

Perhatikan bahwa Anda tidak mengetik >di awal baris kedua. Itulah prompt shell sekunder $PS2,, yang dicetak oleh shell ketika Anda mengetik perintah yang tidak lengkap (misalnya, dalam hal ini, perintah dengan karakter kutipan yang tidak cocok).

kepala kebun
sumber
0

POSIX 7 mengatakan Anda tidak bisa

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

-e tidak didefinisikan dan backslash adalah implementasi didefinisikan:

Jika operan pertama adalah -n, atau jika salah satu operan berisi karakter <backslash>, hasilnya ditentukan-implementasi.

kecuali Anda memiliki ekstensi XSI opsional.

Jadi gunakan printfsaja:

format operan harus digunakan sebagai format string yang dijelaskan dalam Notasi Format File XBD [...]

yang File Format Notasi :

\ n <newline> Pindahkan posisi pencetakan ke awal baris berikutnya.

Juga perlu diingat bahwa Ubuntu 15.10 dan sebagian besar distro mengimplementasikan echokeduanya sebagai:

  • built-in Bash: help echo
  • executable mandiri: which echo

yang dapat menyebabkan beberapa kebingungan.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
Akan ada echobuiltin di setiap shell yang tersedia di sistem. Di Ubuntu / bin / sh biasanya dash, bash juga datang secara default. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... semua akan memiliki gema sendiri dengan perilaku yang berbeda. Perhatikan bahwa which echotidak akan memberi Anda jalur gema sistem di semua shell.
Stéphane Chazelas
@ StéphaneChazelas "gema yang tidak akan memberi Anda jalur gema sistem di semua shell." Yang saya tidak tahu, apa lagi yang bisa diberikannya?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Coba di tcsh atau zsh. whichawalnya (di tahun 80-an) skrip csh hanya untuk pengguna csh (memuat alias dari ~ / .cshrc) dan masih ada di beberapa sistem. whichadalah builtin di zsh dan tcsh.
Stéphane Chazelas