2013-01-18 49 views
10

मुझे sed में एक खोज पैटर्न के रूप में कमांड के आउटपुट का उपयोग करने की आवश्यकता है। मैं गूंज का उपयोग कर एक उदाहरण कर देगा, लेकिन लगता है कि एक और अधिक जटिल आदेश हो सकता है:खोज पैटर्न में sed के साथ xargs का उपयोग कैसे करें

echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt 

आदेश काम नहीं करता है, क्योंकि "कुछ पैटर्न" एक खाली स्थान के है, लेकिन मुझे लगता है कि स्पष्ट रूप से मेरी समस्या को दर्शाते हैं।

मैं यह आदेश कैसे काम कर सकता हूं?

अग्रिम धन्यवाद,

उत्तर

6

उपयोग आदेश प्रतिस्थापन के बजाय, तो आपके उदाहरण देखने के लिए की तरह होगा: दोहरे उद्धरण चिह्नों

sed -i "s/$(echo "some pattern")/replacement/g" file.txt 

जबकि विभाजन होने से रिक्त स्थान को रोकने आदेश प्रतिस्थापन काम करने के लिए अनुमति देते हैं।

10

आपको x स्विच को -इ स्विच के साथ प्रतिस्थापित करने की आवश्यकता है - यह कम से कम कुछ संस्करणों में {} स्वचालित रूप से {} के बारे में नहीं लगता है।

echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt 
+1

धन्यवाद! आपने मेरा दिन बना दिया! :) – harrison4

0

आप (जीएनयू एसईडी) के लिए यह काम कर सकते हैं:

echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt 

अनिवार्य रूप से एक sed प्रतिस्थापन आदेश में some pattern कर देते हैं और एक पाइप के माध्यम से इसे एक और एसईडी मंगलाचरण के लिए खाते हैं। अंतिम sed invocation -f स्विच का उपयोग करता है जो एक फ़ाइल के माध्यम से sed आदेश स्वीकार करता है, इस मामले में फ़ाइल मानक इनपुट - है।

आप बैश का उपयोग कर रहे हैं, तो here-string नियोजित किया जा सकता:

<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt 

N.B. sed विभाजक | और /some pattern का हिस्सा नहीं होना चाहिए अन्यथा regexp ठीक से नहीं बनाया जाएगा।

1

इस लिनक्स पर काम करता है (परीक्षण किया):

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'