2010-06-09 17 views
26

Câu hỏi thực sự đơn giản, làm cách nào để kết hợp echo và cat trong shell, tôi đang cố gắng ghi nội dung của tệp vào một tệp khác bằng chuỗi được thêm trước?Kết hợp echo và cat trên Unix

Nếu/tmp/tập tin trông như thế này:

this is a test 

Tôi muốn chạy này:

echo "PREPENDED STRING" 
cat /tmp/file | sed 's/test/test2/g' > /tmp/result 

để/tmp/kết quả trông như thế này:

PREPENDED STRINGthis is a test2 

Cảm ơn.

Trả lời

30

này nên làm việc:

echo "PREPENDED STRING" | cat - /tmp/file | sed 's/test/test2/g' > /tmp/result 
+3

Tôi thích sự đơn giản này, nhưng để hoàn thành, phải có cờ -n trên echo như được đề cập trong câu trả lời khác. – Dan

+6

Đối với bất kỳ ai khác tự hỏi về '-' trong' cat' args, từ trang của người đàn ông: 'Không có TẬPTIN, hoặc khi TẬPTIN là -, đọc đầu vào tiêu chuẩn.' – SooDesuNe

+2

Cờ '-n' không hoạt động trên tất cả các biến thể của 'echo', nhưng đó chủ yếu là một ghi chú lịch sử. – reinierpost

11

Hãy thử:

(printf "%s" "PREPENDED STRING"; sed 's/test/test2/g' /tmp/file) >/tmp/result 

Dấu ngoặc chạy lệnh (s) bên trong một subshell, do đó đầu ra trông giống như một dòng duy nhất cho >/tmp/result chuyển hướng.

2

Hoặc chỉ cần sử dụng chỉ sed

sed -e 's/test/test2/g 
s/^/PREPEND STRING/' /tmp/file > /tmp/result 
+0

cho "one-liner-ness" sử dụng 2 '-e''s:' sed -e 's/test/test2/g' -e 's/^/PREPEND STRING /' ... ' –

+0

Điều này tất nhiên sẽ thêm chuỗi vào mỗi dòng của tệp đầu vào. –

+0

Điều gì có thể là điều mong muốn. Nếu không: 'sed '1s/^/PREPENDED STRING /; s/test/test2/g '/ tmp/file>/tmp/result' –

0

Hoặc thêm:

{ echo "PREPENDED STRING" ; cat /tmp/file | sed 's/test/test2/g' } > /tmp/result 
+0

Sử dụng vô dụng 'cat', ví dụ: điều này cũng sẽ hoạt động: '{echo" PREPENDED STRING "; sed 's/test/test2/g'; } < /tmp/file >/tmp/kết quả' – reinierpost

0

Một tùy chọn khác: giả sử chuỗi được thêm vào trước chỉ nên xuất hiện một lần và không cho mỗi dòng:

gawk 'BEGIN {printf("%s","PREPEND STRING")} {gsub(/test/, "&2")} 1' in > out 
0

Nếu điều này là bao giờ cho việc gửi một e-mail, hãy nhớ sử dụng kết thúc dòng CRLF, như vậy:

echo -e 'To: [email protected]\r' | cat - body-of-message \ 
| sed 's/test/test2/g' | sendmail -t 

Thông báo các -e -flag và \ r bên trong chuỗi.

Đặt thành: theo cách này trong vòng lặp cung cấp cho bạn trình gửi thư hàng loạt đơn giản nhất trên thế giới.

Các vấn đề liên quan