วิธีการใส่อักขระพิเศษบรรทัดใหม่ลงในไฟล์โดยใช้คำสั่ง echo และโอเปอเรเตอร์การเปลี่ยนเส้นทาง


29

ฉันต้องการสร้างไฟล์โดยใช้คำสั่ง echo และโอเปอเรเตอร์การเปลี่ยนเส้นทางไฟล์ควรสร้างขึ้นมาไม่กี่บรรทัด

ฉันพยายามใส่ newline ด้วย "\ n" ในสตริง:

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

แต่ด้วยวิธีนี้จะไม่มีการสร้างไฟล์ที่มีสามบรรทัด แต่เป็นไฟล์ที่มีเพียงหนึ่งบรรทัดและเนื้อหาคำต่อคำของสตริง

ฉันจะสร้างโดยใช้คำสั่งนี้เฉพาะไฟล์ที่มีหลายบรรทัดได้อย่างไร?


คำตอบ:


30

คุณขอให้ใช้ไวยากรณ์กับechoคำสั่ง:

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

(แต่ให้พิจารณาอีกคำตอบที่คุณได้รับ)

การ$'...'สร้างขยาย ANSI Escape Sequence ที่ฝังตัว


1
โปรดทราบว่านี่ไม่ใช่ POSIX ไม่ว่าจะเป็นส่วนใหญ่หรือไม่นั้นขึ้นอยู่กับว่าคุณใช้เชลล์อะไร
Chris Down

1
คุณพบว่าโครงสร้างในเชลล์ที่โดดเด่น (อย่างน้อย), ksh, bash, zsh (และอื่น ๆ )
Janis

1
@ChrisDown ยังไม่ได้ POSIX แต่มีกำหนดการรวมไว้ในฉบับที่ 8 ksh93, bash, zsh, mksh, FreeBSD sh สนับสนุน
Stéphane Chazelas

24

เสียงสะท้อนที่เกิดจากการหลบหนีของตัวละครนั้นถูกนำไปใช้งาน ในการนำไปใช้งานหลายอย่างของ echo (รวมถึงส่วนใหญ่ที่ทันสมัย), สตริงที่ส่งผ่านจะไม่ตรวจสอบสำหรับการหลบหนีเลยโดยค่าเริ่มต้น

ด้วยเสียงสะท้อนจาก GNU ทุบตี (ในตัว) และตัวแปรอื่น ๆ คุณสามารถทำสิ่งต่อไปนี้:

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
Abdul Al Hazred

คุณต้องพิมพ์ EOF เพียงอย่างเดียวในอินพุตบรรทัดเดียว ...
Rmano

2
@mikeserv คุณเป็นคนขี้กลัวหรือจริงจังหรือเปล่า?
Matthew อ่าน

1
@AbdulAlHazred เป็นลิงก์ในคำตอบหมายถึงมันเรียกว่า "here document" และเป็นเรื่องธรรมดามาก วิกิพีเดียเป็นสิ่งที่ดีในหัวข้อนี้: 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

นี่มีประสิทธิภาพมากกว่าคำตอบที่สองเล็กน้อยซึ่งไม่ได้สร้างกระบวนการย่อย อย่างไรก็ตามไวยากรณ์คือเล็กน้อย trickier: ทราบว่าคุณต้องมีช่องว่างหลังที่และอัฒภาคก่อน{}

ดูตัวควบคุมและการเปลี่ยนเส้นทางของเชลล์คืออะไร สำหรับข้อมูลเพิ่มเติม.


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 หรือถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งมีอักขระ <backslash> ผลลัพธ์จะถูกกำหนดตามการนำไปใช้

ยกเว้นว่าคุณมีนามสกุล XSI ซึ่งเป็นตัวเลือก

ใช้printfแทน:

ตัวถูกดำเนินการรูปแบบจะต้องใช้เป็นสตริงรูปแบบที่อธิบายไว้ในสัญกรณ์รูปแบบไฟล์ XBD [... ]

โน้ตรูปแบบไฟล์ :

\ n <newline> ย้ายตำแหน่งการพิมพ์ไปที่จุดเริ่มต้นของบรรทัดถัดไป

พึงระลึกไว้เสมอว่า Ubuntu 15.10 และ distros ส่วนใหญ่ใช้งานechoทั้งสองอย่างดังนี้:

  • Bash ในตัว: help echo
  • ปฏิบัติการแบบสแตนด์อโลน: which echo

ซึ่งอาจนำไปสู่ความสับสน


จะมีechobuiltin ในทุกเชลล์ที่มีอยู่ในระบบ โดยปกติแล้วบน Ubuntu / bin / sh จะมีการขีดกลางโดยอัตโนมัติ zsh, rc, mksh, yash, csh, tcsh, ksh93 ... ทุกคนจะมีเสียงสะท้อนของตัวเองพร้อมกับพฤติกรรมที่แตกต่างกัน โปรดทราบว่าwhich echoจะไม่ให้เส้นทางของเสียงก้องระบบในทุกเชลล์
Stéphane Chazelas

@ StéphaneChazelas "ซึ่งเสียงสะท้อนจะไม่ให้เส้นทางของระบบเสียงสะท้อนในทุกเชลล์" ที่ฉันไม่รู้, มันจะให้อะไรอีก?
Ciro Santilli 新疆改造中心法轮功六四事件

ลองเป็น tcsh หรือ zsh whichเดิมเป็น (ในยุค 80) สคริปต์ csh สำหรับผู้ใช้ csh เท่านั้น (โหลดนามแฝงจาก ~ / .cshrc) และยังคงอยู่ในบางระบบ whichเป็น builtin ใน zsh และ tcsh
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.