ฉันจะเชื่อม stdin เข้ากับสตริงได้อย่างไร?
echo "input" | COMMAND "string"
และรับ
inputstring
ฉันจะเชื่อม stdin เข้ากับสตริงได้อย่างไร?
echo "input" | COMMAND "string"
และรับ
inputstring
คำตอบ:
บิต hacky แต่นี่อาจจะเป็นทางที่สั้นที่สุดที่จะทำสิ่งที่คุณถามคำถาม (ใช้ท่อที่จะยอมรับstdout
จากecho "input"
เป็นstdin
ในการประมวลผลคำสั่ง / อื่น:
echo "input" | awk '{print $1"string"}'
เอาท์พุต:
inputstring
คุณพยายามทำภารกิจอะไรให้สำเร็จ? บริบทเพิ่มเติมช่วยให้คุณมีทิศทางมากขึ้นเกี่ยวกับโซลูชันที่ดีกว่า
อัปเดต - ตอบกลับความคิดเห็น:
@NoamRoss
วิธีที่เป็นสำนวนมากขึ้นในการทำสิ่งที่คุณต้องการคือ:
echo 'http://dx.doi.org/'"$(pbpaste)"
$(...)
ไวยากรณ์เรียกว่าคำสั่งเปลี่ยนตัว กล่าวโดยย่อคือรันคำสั่งที่อยู่ใน subshell ใหม่และแทนที่stdout
เอาต์พุตเป็นตำแหน่งที่$(...)
ถูกเรียกใช้ในพาเรนต์เชลล์ ดังนั้นคุณจะได้รับผล:
echo 'http://dx.doi.org/'"rsif.2012.0125"
'{print $0"string"}'
เพื่อคว้าทุกสิ่ง
string
ทุกบรรทัดจริงๆ ลองecho 'input'\n'another line' | awk '{print $0"string"}'
.
ใช้cat -
อ่านจาก stdin และนำ$()
ไปทิ้งขึ้นบรรทัดใหม่ต่อท้าย
echo input | COMMAND "$(cat -)string"
อย่างไรก็ตามทำไมคุณไม่วางท่อและดึงเอาท์พุทของด้านซ้ายในการแทนที่คำสั่ง:
COMMAND "$(echo input)string"
ฉันมักจะใช้ไปป์ดังนั้นนี่จึงเป็นวิธีง่ายๆในการเติมคำนำหน้าและคำต่อท้าย stdin:
echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix
pipe
และcat
echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"
? หรือรุ่นที่อ่านได้มากขึ้น:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
คุณสามารถทำได้ด้วย sed:
seq 5 | sed '$a\6'
seq 5 | sed '$ s/.*/\0 6/'
ในตัวอย่างของคุณ:
echo input | sed 's/.*/\0string/'
มีบางวิธีในการทำให้สำเร็จโดยส่วนตัวแล้วฉันคิดว่าสิ่งที่ดีที่สุดคือ:
echo input | while read line; do echo $line string; done
อีกอย่างหนึ่งสามารถแทนที่ "$" (อักขระท้ายบรรทัด) ด้วย "string" ในคำสั่ง sed:
echo input | sed "s/$/ string/g"
ทำไมฉันถึงชอบอดีต? เนื่องจากมันเชื่อมสตริงเข้ากับ stdin ทันทีตัวอย่างเช่นด้วยคำสั่งต่อไปนี้:
(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done
คุณจะได้รับผลลัพธ์แรกทันที:
input_one string
จากนั้น 5 วินาทีคุณจะได้รับเสียงสะท้อนอื่น ๆ :
input_two string
ในทางกลับกันการใช้ "sed" ก่อนอื่นจะดำเนินการกับเนื้อหาทั้งหมดของวงเล็บจากนั้นจึงให้เป็น "sed" ดังนั้นคำสั่ง
(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"
จะส่งออกทั้งสองบรรทัด
input_one string
input_two string
หลังจาก 5 วินาที
สิ่งนี้มีประโยชน์มากในกรณีที่คุณเรียกใช้ฟังก์ชันซึ่งใช้เวลานานในการดำเนินการให้เสร็จสมบูรณ์และต้องการอัปเดตเกี่ยวกับเอาต์พุตของฟังก์ชันอย่างต่อเนื่อง
ฉันรู้ว่านี่ช้าไปสองสามปี แต่คุณสามารถทำได้ด้วยตัวเลือก xargs -J:
echo "input" | xargs -J "%" echo "%" "string"
และเนื่องจากมันเป็น xargs คุณสามารถทำสิ่งนี้กับไฟล์หลายบรรทัดพร้อมกันได้ หาก 'ชื่อ' ไฟล์มีสามบรรทัดเช่น:
Adam
Bob
Charlie
คุณสามารถทำได้:
cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"
-J
ดูเหมือนจะไม่เป็นมาตรฐาน / ทั่วไป บน Linux ( xargs
เป็นส่วนหนึ่งของส่วนไหนGNU findutils
) ฉันได้รับข้อผิดพลาด: xargs: invalid option -- 'J'
นี่คือระบบใด
-J
มีไว้สำหรับเวอร์ชัน Mac สำหรับลินุกซ์-I
ทำหน้าที่เดียวกัน
cat names | xargs -I% echo "I like % because he is nice"
IOW: ไม่จำเป็นต้องใช้-n 1
( xargs
เรียกecho
หนึ่งครั้งต่อบรรทัดของอินพุตอย่างไรก็ตามโดย-I
นัย-L1
) นอกจากนี้การอ้างถึงอาร์กิวเมนต์ที่แยกจากกันทั้งหมดดูเหมือนจะซ้ำซ้อน
คำสั่งที่คุณโพสต์จะใช้สตริง "input" ใช้เป็นสตรีม stdin ของ COMMAND ซึ่งจะไม่ให้ผลลัพธ์ที่คุณต้องการเว้นแต่ว่า COMMAND จะพิมพ์เนื้อหาของ stdin ก่อนจากนั้นจึงพิมพ์อาร์กิวเมนต์บรรทัดคำสั่งออกมา
ดูเหมือนว่าสิ่งที่คุณต้องการทำนั้นใกล้เคียงกับการแทนที่คำสั่งมากกว่า
http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution
ด้วยการแทนที่คำสั่งคุณสามารถมีบรรทัดคำสั่งเช่นนี้:
echo input `COMMAND "string"`
ขั้นแรกจะประเมิน COMMAND ด้วย "string" เป็นอินพุตจากนั้นขยายผลลัพธ์ของการดำเนินการคำสั่งนั้นไปยังบรรทัดโดยแทนที่สิ่งที่อยู่ระหว่างอักขระ "" "
echo input $(COMMAND "string")
แทนที่จะใช้ backticks โชคดีทุกคน.
แมวจะเป็นทางเลือกของฉัน: ls | cat - <(echo new line)
ยังใช้งานได้:
seq -w 0 100 | xargs -I {} echo "string "{}
จะสร้างสตริงเช่น:
string 000
string 001
string 002
string 003
string 004
...
pbpaste | awk '{print "http://dx.doi.org/"$1}'
และได้รับhttp://dx.doi.org/10.1098/rsif.2012.0125