कैसे sed या awk के साथ एक पैटर्न युक्त लाइनों के अंत में जोड़ें?


89

यहाँ उदाहरण फ़ाइल है:

somestuff...
all: thing otherthing
some other stuff

मैं जो करना चाहता हूं वह all:इस तरह से शुरू होने वाली पंक्ति में जोड़ना है :

somestuff...
all: thing otherthing anotherthing
some other stuff

जवाबों:


166

यह मेरे लिए काम करता है

sed '/^all:/ s/$/ anotherthing/' file

पहला भाग खोजने के लिए एक पैटर्न है और दूसरा भाग $एक पंक्ति के अंत के लिए एक साधारण सेड का प्रतिस्थापन है ।

यदि आप प्रक्रिया के दौरान फ़ाइल को बदलना चाहते हैं, तो -iविकल्प का उपयोग करें

sed -i '/^all:/ s/$/ anotherthing/' file

या आप इसे किसी अन्य फ़ाइल पर रीडायरेक्ट कर सकते हैं

sed '/^all:/ s/$/ anotherthing/' file > output

बस कुछ जोड़ने से नई लाइन बनती है, रिप्लेस करना सही तरीका है।
३४ पर zhy

10

यह आपके लिए काम करना चाहिए

sed -e 's_^all: .*_& anotherthing_'

S कमांड (विकल्प) का उपयोग करके आप एक लाइन की खोज कर सकते हैं जो एक नियमित अभिव्यक्ति को संतुष्ट करती है। ऊपर दिए गए कमांड में, &मिलान किए गए स्ट्रिंग के लिए खड़ा है।


9

$0यदि यह स्थिति से मेल खाता है तो आप टेक्स्ट को awk में जोड़ सकते हैं:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

व्याख्या

  • /patt/ {...}यदि रेखा द्वारा दिए गए पैटर्न से मेल खाती है patt, तो उसके भीतर वर्णित क्रियाओं को करें {}
  • इस स्थिति में: /^all:/ {$0=$0" anotherthing"}यदि रेखा शुरू होती है (द्वारा प्रतिनिधित्व की जाती है ^) all:, तो anotherthingपंक्ति में संलग्न करें।
  • 1सही स्थिति के रूप में, की डिफ़ॉल्ट क्रिया को ट्रिगर करता है awk: वर्तमान लाइन ( print $0) प्रिंट करें । यह हमेशा होगा, इसलिए यह या तो मूल लाइन या संशोधित एक को प्रिंट करेगा।

परीक्षा

आपके दिए गए इनपुट के लिए यह लौटाता है:

somestuff...
all: thing otherthing anotherthing
some other stuff

ध्यान दें कि आप पाठ को एक चर में जोड़ सकते हैं:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

सोलारिस पर आपको त्रुटि awk: can't set $0
मिलेगी

@ एसे करने पर आप /usr/xpg4/bin/awk"अच्छा" जाग का उपयोग कर सकते हैं ।
फेडोरक्वी 'एसओ स्टॉप हार्मिंग'


6

यहां सेड का उपयोग करके एक और सरल समाधान है।

$ sed -i 's/all.*/& anotherthing/g' filename.txt

स्पष्टीकरण:

all। * का अर्थ है सभी लाइनें 'सभी' के साथ शुरू हुईं।

और मैच का प्रतिनिधित्व करें (यानी पूरी लाइन जो 'सभी' से शुरू होती है)

फिर sed ने पूर्व को बाद में बदल दिया और 'अन्य' शब्द को जोड़ा


3

Awk के साथ समाधान:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

बस: यदि पंक्ति पंक्ति के साथ शुरू होती है तो all"दूसरी बात", अन्यथा पंक्ति को प्रिंट करें।


4
आप इसे छोटा कर सकते हैं:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
ग्लेन जैकमैन

2
@Prometheus, एक awk स्क्रिप्ट condition {actions}जोड़े से बना है । यदि conditionछोड़ दिया जाता है, तो हर रिकॉर्ड के लिए कार्य किए जाते हैं। यदि {actions}छोड़ दिया जाता है, और स्थिति सच का मूल्यांकन करती है (जो संख्या के लिए मामला है 1) तो डिफ़ॉल्ट कार्रवाई वर्तमान रिकॉर्ड को प्रिंट करना है।
ग्लेन जैकमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.