दो कोष्ठकों के बीच स्ट्रिंग प्रिंट करें


14

मेरे पास इन पंक्तियों के साथ फाइल है

G8 = P(G1,G3)
G9 = P(G3,G4)
G12 = P(G2,G9)
G15 = P(G9,G5)
G16 = P(G8,G12)
G17 = P(G12,G15)

मुझे आउटपुट की आवश्यकता है

G1,G3
G3,G4
.....

मैं इसे sed / grep कमांड या पर्ल के उपयोग से कैसे कर सकता हूं?

जवाबों:


18

कुछ अन्य तरीके:

  • sed

    sed 's/.*(\(.*\))/\1/' file 
  • पर्ल

    perl -pe 's/.*\((.*)\)/$1/' file 

    या

    perl -lanF"[()]" -e 'print $F[1]' file 

    या

    perl -pe 's/.*\((.+?)\).*/$1/;' file 
  • awk

    awk -F"[()]" '{print $2}' file 
  • खोल

    while IFS="()" read a b; do echo "$b"; done < file 

क्या आप इसके बारे में और अधिक बताएंगे कि awk मेथड कैसे काम करता है ?, इसकी याद रखना भी आसान है
satch_boogie

1
@satch_boogie -Fआपको किस वर्ण (ओं) को चुनने देता है जो लाइन को खेतों में विभाजित करने के लिए उपयोग करेगा। यहाँ, मैं इसे एक चरित्र वर्ग ( []) दे रहा हूँ, जिसमें कोष्ठक खोलने और बंद करने का काम है। तो यह लाइन को (और आगे विभाजित करेगा )। नतीजतन, 2 क्षेत्र कोष्ठकों की सामग्री होगी। जैसे, तार के साथ G8 = P(G1,G3)foo, $1होगा G8 = P, $2होगा G1,G3और $3होगा foo
terdon

7

इसे करने का एक से अधिक तरीका है:

perl -nle 'print $1 if /\((.*)\)/' file

या:

awk 'NR > 1 {print $1}' RS='(' FS=')' file

5
grep -oP '\(\K[^)]+' file

यह शुरुआती कोष्ठक की तलाश करता है, इसे अनदेखा करता है, फिर सभी गैर-क्लोज-कोष्ठक वर्णों का अनुसरण करता है।

जीएनयू grep की आवश्यकता है


5

sed 's/^.*(//;s/)$//' /path/to/file

इसे तोड़ने के लिए:

sedहै stream editor। 's/^.*(//;s/)$//'स्क्रिप्ट को भेजा जा रहा है sed, जो निम्नलिखित के रूप में टूट जाती है:

s/^.*(//    substitute nothing for the beginning of any line (`^`) followed by anything up until an open-paren (`(`)
s/)$//      substitute nothing for a close-paren (`)`) followed immediately by the end of a line

1

एक सरल कटौती समाधान:

$ बिल्ली test01 | कट -d "(" -f2 | कट -d ")" -f1


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