2010-12-20 15 views
6

ग्रीटज़ लोगों के बराबर है।शैल PHP के preg_replace()

मैं एक शैल स्क्रिप्ट में PHP की preg_replace() (नियमित अभिव्यक्ति से मिलान करने वाला टेक्स्ट ढूंढें और इसे प्रतिस्थापित) की तुलना में एक ही सामान करने का एक तरीका ढूंढ रहा हूं।

तो, निम्न फ़ाइल पर विचार करें।

<a href="http://example.com/">Website #1</a> 
<a href="http://example.net/">Website #2</a> 
<a href="http://example.org/">Website #3</a> 

और मैं इस प्राप्त करना चाहते हैं:

http://example.com/ 
http://example.net/ 
http://example.org/ 

वहाँ यह करने के लिए कोई तरीका है? धन्यवाद।

+0

आपका पाठ अपने उदाहरण से अलग से आगे जाने के लिए संभव है दिखाते हैं। क्या आप अपने तारों के भाग (जैसे) अपने उदाहरणों में निकालना चाहते हैं या क्या आप वास्तव में इसे किसी चीज़ से बदलना चाहते हैं? – plundra

+1

इसके अलावा, [नियमित अभिव्यक्तियों के साथ एचटीएमएल का विश्लेषण न करें] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) (में सामान्य)। – delnan

+0

यदि आप कहते हैं, "तो, निम्न फ़ाइल पर विचार करें।", तो लोग मान लेंगे कि यह डेटा है। अगली बार एक उचित सवाल करें। – Anders

उत्तर

9

आप उपयोग कर सकते हैं sed के रूप में:

sed -r 's/.*href="([^"]*)".*/\1/' file 

See it

+0

ग्रेट, धन्यवाद! तो मुझे लगता है कि एक रेगेक्स का उपयोग करने के लिए sed कहना है, लेकिन '\ 1 /' के लिए क्या है? – seriousdev

+0

नहीं, '' 'विकल्प है और \ 1' पहला मैच (समूह? शब्द के बारे में अनिश्चित) है, 1 पहले संश्लेषण की सामग्री है। उपरोक्त मामले में '[^"] * ' – plundra

+0

@plundra धन्यवाद। – seriousdev

0

जबकि sed पूरी तरह से उपयुक्त है, यह 9 से अधिक backreferences अनुमति नहीं है। पर्ल करता है:

echo "a b c d e f g h i j k l m n o p q r s t u v w x y z" | \ 
    perl -lpe 's/(\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)/$1;$2;$3;$4;$5;$6;$7;$8;$9;$10;$11;$12;$13;$14;$15;$16;$17;$18;$19;$20;$21;$22;$23;$24;$25;$26/g' 
a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z 

यह (मूक) उदाहरण यह sed के \9