从命令行打印正则表达式的所有匹配项?

时间:2011-06-07 01:17:33

标签: regex perl grep

在unix命令行上将所有匹配(每个匹配一行或每行输入一行)打印到正则表达式的最简单方法是什么?请注意,每行输入可能有0个或多个匹配。

我认为必须有一些方法可以使用sed,awk,grep和/或perl来实现这一点,我希望有一个简单的命令行解决方案,以便它将在我的bash历史记录中显示在将来需要的时候

编辑:为了澄清,我不想打印所有匹配的行,只打印正则表达式的匹配。例如,一行可能有1000个字符,但正则表达式只有两个10个字符的匹配项。我只对这两个10个字符的比赛感兴趣。

4 个答案:

答案 0 :(得分:13)

假设您只使用非捕获括号,

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

答案 1 :(得分:6)

除非我误解了你的问题,否则以下内容将会解决问题

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

有关详细信息,请参阅:

答案 2 :(得分: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'

(或者只输入命令本身并输入文本以逐行匹配,但这似乎不是一个可能的用例:)。

示例(来自您的评论):

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

答案 3 :(得分:1)

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