Regex 是否从命令行打印正则表达式的所有匹配项?
在unix命令行上将所有匹配项(每匹配一行或每输入一行)打印到正则表达式的最简单方法是什么?请注意,每行输入可能有0个或多个匹配项 我假设一定有某种方法可以通过sed、awk、grep和/或perl实现这一点,我希望有一个简单的命令行解决方案,以便将来需要时它会出现在我的bash历史记录中Regex 是否从命令行打印正则表达式的所有匹配项?,regex,perl,grep,Regex,Perl,Grep,在unix命令行上将所有匹配项(每匹配一行或每输入一行)打印到正则表达式的最简单方法是什么?请注意,每行输入可能有0个或多个匹配项 我假设一定有某种方法可以通过sed、awk、grep和/或perl实现这一点,我希望有一个简单的命令行解决方案,以便将来需要时它会出现在我的bash历史记录中 编辑:为了澄清,我不想打印所有匹配行,只打印正则表达式的匹配项。例如,一行可能有1000个字符,但只有两个10个字符与正则表达式匹配。我只对这两个10个字符的匹配感兴趣。假设您只使用非捕获括号 perl -w
编辑:为了澄清,我不想打印所有匹配行,只打印正则表达式的匹配项。例如,一行可能有1000个字符,但只有两个10个字符与正则表达式匹配。我只对这两个10个字符的匹配感兴趣。假设您只使用非捕获括号
perl -wnE'say /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
离开注释,假设您通过管道或
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"}}'
(或者只需键入命令本身并输入逐行匹配的文本,但这似乎不是一个可能的用例:)
示例(来自您的评论):
除非我误解了你的问题,否则下面的方法就行了
grep -o 'fo.*d' input.txt
有关更多详细信息,请参阅:
grep-o
将只显示匹配的部分。对于Perl风格的正则表达式,将后者与-P
结合使用。刚才注意到grep-o'fo*d'input.txt
似乎也可以工作。如有必要,可使用--Color=never
删除颜色。
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'
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
grep -o 'fo.*d' input.txt
perl -MSmart::Comments -ne '@a=m/(...)/g;print;' -e '### @a'