केवल sed के साथ समाधान
sed, स्वयं, असंशोधित और संशोधित लाइन दोनों का उत्पादन करने में सक्षम है:
$ echo "redis::staging::key" | sed 's/^/RENAME /; p; s/staging/development/g'
RENAME redis::staging::key
RENAME redis::development::key
उपरोक्त में, sed पहले RENAME स्ट्रिंग को लाइन की शुरुआत में जोड़ता है। फिर, p
कमांड sed को उस समय लाइन को प्रिंट करने के लिए कहता है (इसमें "स्टेजिंग" अभी भी है)। अगला प्रतिस्थापन "विकास" में डालता है और फिर वह संस्करण भी मुद्रित होता है।
अपडेट करें: मान लीजिए हम एक लाइन पर आउटपुट चाहते हैं:
$ echo "redis::staging::key" | sed 's/.*/RENAME & &/; s/staging/development/2'
RENAME redis::staging::key redis::development::key
पहला s
ऊपर दिया गया कमांड RENAME को शुरुआत में जोड़ता है और फिर लाइन को दोगुना करता है। दूसरा विकास के साथ मंचन की दूसरी घटना को बदल देता है।
xargs संस्करण ने प्रतिस्थापन क्यों नहीं किया?
xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')"
xargs निष्पादित होने से पहले, बैश स्ट्रिंग्स को संसाधित करता है। विशेष रूप से, यह देखता है $(echo {} | sed 's/staging/development/g')
और यह इसे निष्पादित करता है ("कमांड प्रतिस्थापन") और परिणाम प्राप्त करता है {}
. इसलिए, जब xargs अंत में चलाया जाता है, तो यह कमांड देखता है:
xargs -I {} echo "RENAME {} {}"
नतीजतन, s/staging/development/g
प्रतिस्थापन कभी नहीं किया जाता है।
xargs और शेल को एक साथ उचित क्रम में काम करना
इसके लिए एक समाधान है:
$ echo "redis::staging::key" | xargs -I {} sh -c 'echo RENAME {} $(echo {} | sed 's/staging/development/g')'
RENAME redis::staging::key redis::development::key
उपरोक्त बैश कमांड को सिंगल-कोट्स के भीतर रखता है और उन्हें तर्क के रूप में पास करता है sh
. इस तरह, स्ट्रिंग को शेल द्वारा तब तक संसाधित नहीं किया जाता है जब तक कि xargs ने प्रतिस्थापन नहीं किया हो।