在unix命令行上将所有匹配(每个匹配一行或每行输入一行)打印到正则表达式的最简单方法是什么?请注意,每行输入可能有0个或多个匹配。
我认为必须有一些方法可以使用sed,awk,grep和/或perl来实现这一点,我希望有一个简单的命令行解决方案,以便它将在我的bash历史记录中显示在将来需要的时候
编辑:为了澄清,我不想打印所有匹配的行,只打印正则表达式的匹配。例如,一行可能有1000个字符,但正则表达式只有两个10个字符的匹配项。我只对这两个10个字符的比赛感兴趣。
答案 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'