Làm cách nào để đặt một ký tự đặc biệt dòng mới vào một tệp bằng cách sử dụng lệnh echo và toán tử chuyển hướng?


29

Tôi muốn tạo một tệp bằng cách sử dụng lệnh echo và toán tử chuyển hướng, tệp nên được tạo bằng một vài dòng.

Tôi đã cố gắng đưa một dòng mới vào "\ n" trong chuỗi:

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

nhưng theo cách này, không có tệp nào có ba dòng được tạo mà là một tệp chỉ có một dòng và nội dung nguyên văn của chuỗi.

Làm thế nào tôi có thể tạo chỉ bằng lệnh này một tệp có nhiều dòng?


Câu trả lời:


30

Bạn đã yêu cầu sử dụng một số cú pháp với echolệnh:

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

(Nhưng cũng xem xét câu trả lời khác mà bạn có.)

Cấu $'...'trúc mở rộng các chuỗi thoát ANSI nhúng.


1
Lưu ý rằng đây không phải là POSIX, việc nó có khả dụng hay không phụ thuộc vào loại vỏ bạn đang sử dụng.
Chris Down

1
Bạn tìm thấy cấu trúc đó trong các shell nổi bật (ít nhất), ksh, bash, zsh (và có thể cả những thứ khác).
Janis

1
@ChrisDown, chưa phải là POSIX, nhưng được lên lịch để đưa vào vấn đề 8. ksh93, bash, zsh, mksh, FreeBSD sh hỗ trợ nó.
Stéphane Chazelas

24

Những gì echo làm với ký tự thoát là thực hiện được xác định. Trong nhiều triển khai của echo (bao gồm hầu hết các hiện đại), chuỗi được truyền không được kiểm tra để thoát theo mặc định.

Với tiếng vang được cung cấp bởi GNU bash (dưới dạng dựng sẵn) và một số biến thể tiếng vang khác, bạn có thể thực hiện một số thao tác như sau:

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

Tuy nhiên, nó thực sự nghe giống như bạn muốn printf, dễ đọc hơn đối với tôi và cũng dễ mang theo hơn (nó có tính năng này được xác định bởi POSIX):

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

Bạn cũng có thể cân nhắc sử dụng tài liệu ở đây :

cat > file << 'EOF'
first line
second line
third line
EOF

Tôi đã thử con mèo của bạn> tập tin << 'EOF' trong trình bao, khi tôi nhấn enter, tôi đã nhận được dấu nhắc này> với mỗi dòng, nhưng tôi không thể thoát khỏi nó ngay cả khi nhấn ctrl + x hoặc ctrl + z
Abdul Al Hazred

Bạn phải nhập EOF một mình trong một dòng đầu vào ...
Rmano

2
@mikeerv Bạn có phải là người nghiêm túc hay nghiêm túc?
Matthew Đọc

1
@AbdulAlHazred là liên kết trong câu trả lời cho biết, nó được gọi là "tài liệu ở đây" và rất phổ biến. Wikipedia là tốt về chủ đề này: en.wikipedia.org/wiki/Here_document .
dave_thndry_085 22/03/2015

1
Điều này đã làm việc cho Mac OSX của tôi (cụ thể echo -en 'text..', trong khi câu trả lời được chấp nhận không nhận ra ký tự dòng mới của tôi ( \n), echo -enđã làm.
benjaminmg trong

4

Dưới đây là một số cách khác để tạo tệp nhiều dòng bằng echolệnh:

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

trong đó các lệnh thứ hai và thứ ba sử dụng >>toán tử chuyển hướng, điều này làm cho đầu ra của lệnh được nối (thêm) vào tệp (điểm này đã tồn tại, tại thời điểm này).

Hoặc là

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

trong đó các dấu ngoặc đơn nhóm các echolệnh thành một quy trình con, nó trông và hoạt động giống như bất kỳ chương trình đơn lẻ nào tạo ra nhiều dòng ( lsví dụ như , chẳng hạn).

Một biến thể tinh tế ở trên là

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

Điều này hiệu quả hơn một chút so với câu trả lời thứ hai ở chỗ nó không tạo ra một quy trình phụ. Tuy nhiên, cú pháp hơi phức tạp hơn: lưu ý rằng bạn phải có khoảng trắng sau {dấu chấm phẩy trước dấu chấm phẩy }.

Xem các toán tử điều khiển và chuyển hướng của shell là gì? để biết thêm thông tin.


2

Để cung cấp tùy chọn khác, bạn chỉ cần nhấn Enter (nghĩa là một dòng mới theo nghĩa đen):

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

Lưu ý rằng bạn không gõ >vào đầu dòng thứ hai. Đó là lời nhắc shell thứ cấp $PS2, mà shell in khi bạn nhập lệnh không hoàn chỉnh (ví dụ: trong trường hợp này là lệnh có ký tự trích dẫn chưa từng có).


0

POSIX 7 nói rằng bạn không thể

http://pub.opengroup.org/onlinepub/9699919799/utilities/echo.html

-e không được xác định và dấu gạch chéo ngược được thực hiện được xác định:

Nếu toán hạng đầu tiên là -n hoặc nếu bất kỳ toán hạng nào chứa ký tự <backslash>, kết quả được xác định theo thực hiện.

trừ khi bạn có một phần mở rộng XSI tùy chọn.

Vì vậy, sử dụng printfthay thế:

toán hạng định dạng sẽ được sử dụng làm chuỗi định dạng được mô tả trong Ký hiệu định dạng tệp XBD [...]

các định dạng tập tin Notation :

\ n <newline> Di chuyển vị trí in sang đầu dòng tiếp theo.

Ngoài ra, hãy nhớ rằng Ubuntu 15.10 và hầu hết các bản phân phối đều triển khai echocả hai như:

  • một Bash tích hợp: help echo
  • một thực thi độc lập: which echo

có thể dẫn đến một số nhầm lẫn.


Sẽ có một echonội dung trong mọi shell có sẵn trên hệ thống. Trên Ubuntu / bin / sh thường là dấu gạch ngang, bash cũng xuất hiện theo mặc định. zsh, rc, mksh, yash, csh, tcsh, ksh93 ... tất cả sẽ có tiếng vang riêng với hành vi khác nhau. Lưu ý rằng which echosẽ không cung cấp cho bạn đường dẫn của tiếng vang hệ thống trong tất cả các shell.
Stéphane Chazelas

@ StéphaneChazelas "mà echo sẽ không cung cấp cho bạn đường dẫn của tiếng vang hệ thống trong tất cả các shell." Điều đó tôi không biết, nó có thể cho cái gì khác?
Ciro Santilli 心 心 事件

Hãy thử trong tcsh hoặc zsh. whichban đầu (vào những năm 80) một tập lệnh csh chỉ dành cho người dùng csh (đã tải các bí danh từ ~ / .cshrc) và vẫn còn trên một số hệ thống. whichlà một nội dung trong zsh và tcsh.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.