Câu trả lời:
Hơi khó hiểu, nhưng đây có thể là cách ngắn nhất để thực hiện những gì bạn đã hỏi trong câu hỏi (sử dụng một đường ống để chấp nhận stdout
từ echo "input"
như stdin
đến một quy trình / lệnh khác:
echo "input" | awk '{print $1"string"}'
Đầu ra:
inputstring
Chính xác bạn đang cố gắng hoàn thành nhiệm vụ gì? Nhiều ngữ cảnh hơn có thể giúp bạn có thêm định hướng về một giải pháp tốt hơn.
Cập nhật - trả lời bình luận:
@NoamRoss
Sau đó, cách thành ngữ hơn để làm những gì bạn muốn là:
echo 'http://dx.doi.org/'"$(pbpaste)"
Các $(...)
cú pháp được gọi thay thế lệnh . Nói tóm lại, nó thực thi các lệnh được bao bọc trong một vỏ thay thế mới và thay thế stdout
đầu ra của nó vào nơi mà lệnh $(...)
được gọi trong vỏ mẹ. Vì vậy, bạn sẽ nhận được, trong thực tế:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'
lấy toàn bộ.
string
vào mọi dòng. Cố gắng echo 'input'\n'another line' | awk '{print $0"string"}'
.
sử dụng cat -
để đọc từ stdin và đặt nó vào $()
để loại bỏ dòng mới ở cuối
echo input | COMMAND "$(cat -)string"
Tuy nhiên, tại sao bạn không thả đường ống và lấy đầu ra của phía bên trái trong một thay thế lệnh:
COMMAND "$(echo input)string"
Tôi thường sử dụng các đường ống, vì vậy đây có xu hướng là một cách dễ dàng để tạo tiền tố và hậu tố stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipe
vàcat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
:? Hoặc, phiên bản dễ đọc hơn:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
Bạn có thể làm điều đó với sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
Trong ví dụ của bạn:
echo input | sed 's/.*/\0string/'
Có một số cách để thực hiện điều này, cá nhân tôi nghĩ rằng tốt nhất là:
echo input | while read line; do echo $line string; done
Một cách khác có thể bằng cách thay thế "$" (ký tự cuối dòng) bằng "string" trong một lệnh sed:
echo input | sed "s/$/ string/g"
Tại sao tôi thích cái cũ hơn? Bởi vì nó nối một chuỗi với stdin ngay lập tức, ví dụ với lệnh sau:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
bạn ngay lập tức nhận được đầu ra đầu tiên:
input_one string
và sau đó 5 giây, bạn nhận được tiếng vọng khác:
input_two string
Mặt khác, việc sử dụng "sed" trước tiên nó thực hiện tất cả nội dung của dấu ngoặc và sau đó nó đưa nó cho "sed", vì vậy lệnh
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
sẽ xuất ra cả hai dòng
input_one string
input_two string
sau 5 giây.
Điều này có thể rất hữu ích trong trường hợp bạn đang thực hiện các lệnh gọi đến các hàm mất nhiều thời gian để hoàn thành và muốn được cập nhật liên tục về đầu ra của hàm.
Tôi biết điều này là muộn vài năm, nhưng bạn có thể thực hiện điều này với tùy chọn xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
Và vì nó là xargs, bạn có thể thực hiện việc này trên nhiều dòng của tệp cùng một lúc. Nếu tệp 'tên' có ba dòng, như:
Adam
Bob
Charlie
Bạn có thể làm:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-J
dường như không phải là tiêu chuẩn / phổ biến. Trên Linux (ở đâu xargs
là một phần của GNU findutils
) tôi gặp lỗi: xargs: invalid option -- 'J'
Hệ thống này nằm trên hệ thống nào?
-J
dành cho phiên bản Mac. Đối với Linux -I
thực hiện chức năng tương tự.
cat names | xargs -I% echo "I like % because he is nice"
IOW: không cần -n 1
( dù sao cũng xargs
gọi echo
một lần cho mỗi dòng đầu vào, vì -I
ngụ ý -L1
) Ngoài ra, tất cả các trích dẫn đối số riêng biệt, dường như là thừa.
Lệnh bạn đã đăng sẽ lấy chuỗi "input" sử dụng nó làm dòng stdin của COMMAND, điều này sẽ không tạo ra kết quả mà bạn đang tìm kiếm trừ khi COMMAND in ra nội dung của stdin trước và sau đó in ra các đối số dòng lệnh của nó.
Có vẻ như những gì bạn muốn làm gần với việc thay thế lệnh hơn.
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
Với thay thế lệnh, bạn có thể có một dòng lệnh như sau:
echo input `COMMAND "string"`
Điều này đầu tiên sẽ đánh giá COMMAND với "chuỗi" làm đầu vào, và sau đó mở rộng kết quả thực hiện lệnh đó thành một dòng, thay thế những gì giữa các ký tự '`'.
echo input $(COMMAND "string")
, thay vì backticks. Chúc mọi người may mắn.
pbpaste | awk '{print "http://dx.doi.org/"$1}'
và nhận đượchttp://dx.doi.org/10.1098/rsif.2012.0125