स्टड और एक स्ट्रिंग को कैसे बदलना है?


108

मैं स्ट्रिंग को कैसे समतल कर सकता हूं, इस तरह से?

echo "input" | COMMAND "string"

और पाओ

inputstring

जवाबों:


119

एक hacky सा है, लेकिन यह है कि तुम क्या सवाल (स्वीकार करने के लिए एक पाइप का उपयोग में पूछा करने के लिए सबसे छोटा रास्ता हो सकता है stdoutसे echo "input"के रूप में stdinकिसी अन्य प्रक्रिया / आदेश करने के लिए:

echo "input" | awk '{print $1"string"}'

आउटपुट:

inputstring

आप किस कार्य को पूरा करने की कोशिश कर रहे हैं? अधिक संदर्भ आपको बेहतर समाधान पर अधिक दिशा प्राप्त कर सकते हैं।

अपडेट - टिप्पणी का जवाब:

@NoamRoss

जो आप चाहते हैं उसे करने का अधिक मुहावरेदार तरीका है:

echo 'http://dx.doi.org/'"$(pbpaste)"

$(...)वाक्य रचना कहा जाता है आदेश प्रतिस्थापन । संक्षेप में, यह एक नई उप-धारा में संलग्न आदेशों को निष्पादित करता है, और इसके stdoutआउटपुट को प्रतिस्थापित करता है जहां $(...)मूल शेल में लागू किया गया था। तो आप प्राप्त करेंगे, प्रभाव में:

echo 'http://dx.doi.org/'"rsif.2012.0125"

1
धन्यवाद! यह बहुत अच्छा काम करता है। सटीक कार्य जिसे मैं पूरा करने की कोशिश कर रहा हूं, वह क्लिपबोर्ड (डीओआई) से एक स्ट्रिंग लेना और इसके लिए एक यूआरएल तैयार करना है, इसलिए इसके साथ मैं करता हूं pbpaste | awk '{print "http://dx.doi.org/"$1}'और प्राप्त करता हूंhttp://dx.doi.org/10.1098/rsif.2012.0125
नोम रॉस

5
@ sampson-chen, मैं '{print $0"string"}'पूरी चीज़ को हथियाने के लिए उपयोग करूँगा ।
रोमन न्यूजा

3
यह वास्तव stringमें हर पंक्ति में शामिल है। कोशिश करो echo 'input'\n'another line' | awk '{print $0"string"}'
टॉमक्वी

55

cat -स्टडिन से पढ़ने के लिए उपयोग करें, और इसे $()अनुगामी न्यूलाइन को दूर करने के लिए डालें

echo input | COMMAND "$(cat -)string"

हालाँकि आप पाइप को क्यों नहीं छोड़ते हैं और बाईं ओर के आउटपुट को कमांड प्रतिस्थापन में ले जाते हैं:

COMMAND "$(echo input)string"

1
यहाँ एक व्यावहारिक उदाहरण है: ~ / other_program / lib -name "* .jar" खोजें tr '\ n' ':' | गूंज "$ (बिल्ली -) ~ / java_app / कक्षाएं"
अश्विन जयप्रकाश

2
यह मेरे लिए काम करता है, लेकिन zsh में मुझे "कैट: -: इनपुट / आउटपुट एरर" मिलता है। किसी भी विचार यह क्या कारण हो सकता है?
जयमेर - मोनिका

"COMMAND" समाधान के लिए खड़ा है और कुछ और जटिल प्रक्रिया के लिए "इको इनपुट"। "-" बिल्ली के लिए arg केवल तभी आवश्यक है जब अन्य फ़ाइल args हो, अन्यथा यह डिफ़ॉल्ट है। तो आपका क्या मतलब था: इको इनपुट | इको $ (बिल्ली) स्ट्रिंग
डेनिस होवे

46

मैं अक्सर पाइप का उपयोग कर रहा हूं, इसलिए यह उपसर्ग और प्रत्यय स्टडिन के लिए एक आसान तरीका है:

echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix

2
धन्यवाद! यह वास्तव में उपयोग करने का बहुत अच्छा उदाहरण हैpipecat
एलेक्स इवासेवुव

1
इसका सबसे अच्छा उत्तर होना चाहिए
क्रिस कोस्टोन

1
सिर्फ क्यों नहीं echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix":? या, अधिक पठनीय संस्करण:echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
MiniMax

1
@MiniMax क्योंकि उत्तर धाराओं के साथ अच्छी तरह से काम करता है, यह बड़े स्टाइन के लिए काम करेगा।
अनिशपतेल

1
@ लुप्तप्राय मेरा संस्करण बड़े स्टड के लिए भी काम करेगा। कोई फर्क नहीं।
मिनीमैक्स


9

इसे पूरा करने के कुछ तरीके हैं, मुझे लगता है कि व्यक्तिगत रूप से सबसे अच्छा है:

echo input | while read line; do echo $line string; done

एक और "कमांड" (लाइन कैरेक्टर का अंत) को "कमांड" के साथ एक सेड कमांड में प्रतिस्थापित करके हो सकता है:

echo input | sed "s/$/ string/g"

मैं पूर्व को क्यों पसंद करता हूं? क्योंकि यह तुरंत स्ट्रिंग को एक स्ट्रिंग समेटता है, उदाहरण के लिए निम्न कमांड के साथ:

(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 सेकंड के बाद।

यह उन मामलों में बहुत उपयोगी हो सकता है, जब आप फ़ंक्शन को कॉल कर रहे हैं जो पूरा होने में लंबा समय लेता है और फ़ंक्शन के आउटपुट के बारे में लगातार अपडेट रहना चाहता है।


दरअसल, सेड ऑप्शन इनपुट की हर लाइन को तुरंत प्रोसेस करता है।
टोमेक्वी

इनपुट की एकल पंक्ति के लिए, सबसे सरल समाधान इको इनपुट है | (रीड वी; इको $ {v} स्ट्रिंग) यह शुद्ध शेल है, इसलिए इसमें सीड जैसी अतिरिक्त प्रक्रिया की आवश्यकता नहीं है।
डेनिस होवे

7

मुझे पता है कि यह कुछ साल देर से है, लेकिन आप इसे 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"

1
लगता है सिवाय इसके -Jकि मानक / आम नहीं लगता। लिनक्स पर (जहां xargsका हिस्सा है GNU findutils) मुझे त्रुटि मिलती है: यह xargs: invalid option -- 'J'किस सिस्टम पर है?
1

3
-Jमैक संस्करण के लिए है। लिनक्स के -Iलिए एक ही कार्य करता है।
user2635263

1
धन्यवाद! बहुत उपयोगी। कृपया ध्यान दें कि लिनक्स पर, यह सरलीकृत संस्करण बस के रूप में अच्छी तरह से काम करता है: cat names | xargs -I% echo "I like % because he is nice"IOW: -n 1( किसी भी समय इनपुट की प्रति पंक्ति एक बार xargsकॉल करने की आवश्यकता नहीं echoहै, -Iइसका तात्पर्य है -L1), इसके अलावा, सभी अलग-अलग arg उद्धृत, निरर्थक लगते हैं।
अरीफ

3

आपके द्वारा पोस्ट की गई कमांड स्ट्रिंग "इनपुट" लेगी, इसका उपयोग COMMAND की स्टडिन स्ट्रीम के रूप में करेंगे, जो आपके द्वारा खोजे जा रहे परिणामों का उत्पादन नहीं करेगा, जब तक COMMAND ने पहले अपने स्टड की सामग्री को प्रिंट नहीं किया और फिर अपनी कमांड लाइन की दलीलें छापीं।

ऐसा लगता है कि आप जो करना चाहते हैं वह कमांड प्रतिस्थापन के अधिक करीब है।

http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

कमांड प्रतिस्थापन के साथ आप इस तरह एक कमांडलाइन हो सकते हैं:

echo input `COMMAND "string"`

यह पहले इनपुट के रूप में "स्ट्रिंग" के साथ COMMAND का मूल्यांकन करेगा, और फिर '' 'वर्णों के बीच की जगह पर एक पंक्ति में उस आदेश के निष्पादन के परिणामों का विस्तार करेगा।


और निश्चित रूप से @NaomRoss, जब तक आपको बॉर्न शेल का उपयोग करने की आवश्यकता नहीं होती है या अन्य पागल "पोर्टेबिलिटी" जनादेश होते हैं, आप echo input $(COMMAND "string")बैकटिक्स के बजाय आधुनिक कमांड प्रतिस्थापन का उपयोग करेंगे । सभी को सफलता मिले।
शेल्टर

1

बिल्ली मेरी पसंद होगी: ls | cat - <(echo new line)


sed एक लाइन आधारित कमांड है जो काम नहीं करता है अगर अपस्ट्रीम पाइप में कुछ भी आउटपुट नहीं है ..
क्लार्कटफू

0

यह भी काम करता है:

seq -w 0 100 | xargs -I {} echo "string "{}

जैसे तार उत्पन्न करेंगे:

string 000
string 001
string 002
string 003
string 004

...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.