Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 是否从命令行打印正则表达式的所有匹配项?_Regex_Perl_Grep - Fatal编程技术网

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

Regex 是否从命令行打印正则表达式的所有匹配项?,regex,perl,grep,Regex,Perl,Grep,在unix命令行上将所有匹配项(每匹配一行或每输入一行)打印到正则表达式的最简单方法是什么?请注意,每行输入可能有0个或多个匹配项 我假设一定有某种方法可以通过sed、awk、grep和/或perl实现这一点,我希望有一个简单的命令行解决方案,以便将来需要时它会出现在我的bash历史记录中 编辑:为了澄清,我不想打印所有匹配行,只打印正则表达式的匹配项。例如,一行可能有1000个字符,但只有两个10个字符与正则表达式匹配。我只对这两个10个字符的匹配感兴趣。假设您只使用非捕获括号 perl -w

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

我假设一定有某种方法可以通过sed、awk、grep和/或perl实现这一点,我希望有一个简单的命令行解决方案,以便将来需要时它会出现在我的bash历史记录中


编辑:为了澄清,我不想打印所有匹配行,只打印正则表达式的匹配项。例如,一行可能有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
有关更多详细信息,请参阅:


到正则表达式?我猜你指的是一个regex对不起,你能把你想要的扩展一下吗?表面上看,这听起来像是一个彻头彻尾的“grep”,但我知道这不可能是全部假设输入为“fod,food,fad\nbar\n foood\n”,正则表达式为“fo*d”。然后输出应该是“fod\n food\n foood\n”或“fod food\n\n foood\n”。它不应该打印整个匹配行。GNU
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'