2011-06-07 32 views
2

將unix命令行中的所有匹配(每個匹配一行或每行輸入一行)打印到正則表達式的最簡單方法是什麼?請注意,每行輸入可能有0個或多個匹配項。從命令行打印正則表達式的所有匹配項?

我認爲必須有一些方法來使用sed,awk,grep和/或perl來做到這一點,我希望有一個簡單的命令行解決方案,以便在需要時顯示在我的bash歷史記錄中未來。

編輯:澄清,我不想打印所有匹配的行,只有正則表達式匹配。例如,一行可能有1000個字符,但與正則表達式只有兩個10個字符的匹配。我只對這兩個10個字符的比賽感興趣。

+0

的正則表達式?我認爲你的意思是一個正則表達式 – matchew 2011-06-07 01:20:44

+1

對不起,你可以擴展一下你想要的東西嗎?從表面上看,這聽起來像是一個簡單的「grep」,但我知道這並不是全部。 :) – 2011-06-07 01:21:32

+0

假設輸入是「fod,food,fad \ nbar \ nfoooood \ n」,正則表達式是「fo * d」。然後輸出應該是「fod \ nfood \ nfoooood \ n」或「fodfood \ n \ nfoooood \ n」。 – jonderry 2011-06-07 01:25:32

回答

12

假設你只使用非捕獲括號,

perl -wnE'say /yourregex/g' 

perl -wnE'say for /yourregex/g' 

使用示例:

$ echo -ne 'fod,food,fad\nbar\nfooooood\n' | perl -wnE'say for /fo*d/g' 
fod 
food 
fooooood 
$ echo -ne 'fod,food,fad\nbar\nfooooood\n' | perl -wnE'say /fo*d/g' 
fodfood 

fooooood 
+2

只要注意到'grep -o'fo * d'input.txt'似乎也能工作。如果需要,可以使用'--color = never'移除顏色。 – jonderry 2011-06-07 02:16:12

1

去關閉評論,假設你通過了從管道輸入或以其他方式輸入STDIN

perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}' 

用法:

cat SOME_TEXT_FILE | perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}' 'YOUR_REGEX' 

或我只想東西,全亂成bash函數...

bggrep() 
{ 
    if [ "x$1" != "x" ]; then 
     perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}' $1; 
    else 
     echo "Usage: bggrep <regex>"; 
    fi 
} 

用法是一樣的,只是更清潔的前瞻性:

cat SOME_TEXT_FILE | bggrep 'YOUR_REGEX' 

(或者只是輸入命令本身並輸入文本以逐行匹配,b這似乎不是一個可能的用例:)。

例(從您的評論):

bash$ cat garbage 
fod,food,fad 
bar 
fooooooood 
bash$ cat garbage | perl -e 'my $re=shift;$re=~qr{$re};while(<STDIN>){if(/($re)/g){print"$1\n"}while(m/\G.*?($re)/g){print"$1\n"}}' 'fo*d' 
fod 
food 
fooooooood 

或...

bash$ cat garbage | bggrep 'fo*d' 
fod 
food 
fooooooood 
6

除非我誤解你的問題,下面會做的伎倆

grep -o 'fo.*d' input.txt 

更多詳情請參閱:

+0

它不應該打印整個匹配行。 – jonderry 2011-06-07 01:54:26

+0

@jonderry:請更新您的問題,以包含 – 2011-06-07 05:08:33

+3

['ack -o'](http://betterthangrep.com)和GNU'grep -o'將只顯示匹配的部分。將後者與'-P'合併爲Perl風格的正則表達式。 – daxim 2011-06-07 07:56:41

1
perl -MSmart::Comments -ne '@a=m/(...)/g;print;' -e '### @a' 
相關問題