जीएनयू grep -P के साथ एक पर्ल संगत रेगीक्स का उपयोग करना


10

मैं इस regex का उपयोग (?<=\[')[^,]*निम्न पंक्ति वाली फ़ाइल पर कर रहा हूँdisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

मैं चाहता हूं कि वह वापस लौट आए OVS/sdasd/asdasd/asdasd/something.img

मैं grepइसे काम करने के लिए कैसे उपयोग करूं ?

मैंने कोशिश की है grep -P "(?<=\[')[^,]*"लेकिन यह पूरी लाइन लौटाता है।

जवाबों:


14

-oस्विच जोड़ें ताकि grepकेवल वही रिटर्न मिले जो उस पैटर्न से मेल खाता हो जिसके लिए आप तैयारी कर रहे हैं:

$ grep -Po "(?<=\[')[^,]*" data.txt 
OVS/sdasd/asdasd/asdasd/something.img

6

आप sedअधिक पोर्टेबिलिटी के लिए लुकअर्स दावे के बिना भी उपयोग कर सकते हैं ( -oआपके लिए उपलब्ध नहीं हो सकता है grep):

sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt

बैकस्लैश के "अजीब" उपयोग पर ध्यान दें, यहां से भाग जाता है। यह इस तथ्य के कारण है कि sedडिफ़ॉल्ट रूप से BRES का उपयोग होता है ( यह प्रश्न देखें )।

पोर्टेबिलिटी की बात करें तो सिर्फ पर्ल का ही इस्तेमाल क्यों?

perl -nle "print \$1 if /\['([^,]*)/" data.txt

2

@ एसएलएम ने आपको पहले ही विहित उत्तर दिया। यहाँ कुछ और विकल्प दिए गए हैं:

फ़ील्ड सीमांकक के रूप में उपयोग करें awkऔर '(सभी पंक्तियों को एक ही स्वरूप मानकर):

$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w    

पूरी बात पर्ल में करें:

$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt 
OVS/sdasd/asdasd/asdasd/something.img, w    

एक सरल regex का उपयोग करें और परिणामों को पार्स करें:

$ grep "\[.*\]" data.txt | awk -F "'" '{print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep -o "\[.*\]" data.txt | perl -pe "s/[\[\]']//g"
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | sed 's/.*\[.\(.*\).\]/\1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -pne 's/.*\[.(.*?).\].*/$1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -lne 'print $1 if /\[.(.*?).\]/'
OVS/sdasd/asdasd/asdasd/something.img, w
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.