【问题标题】:Print all matches of a regular expression from the command line?从命令行打印正则表达式的所有匹配项?
【发布时间】:2011-09-09 17:25:18
【问题描述】:

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

我认为必须有某种方法可以使用 sed、awk、grep 和/或 perl 来执行此操作,并且我希望有一个简单的命令行解决方案,以便将来需要时它会显示在我的 bash 历史记录中.

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

【问题讨论】:

  • 到正则表达式?我想你的意思是正则表达式
  • 对不起,你能扩展一下你想要的吗?从表面上看,这听起来像是一个简单的“grep”,但我知道这不可能是它的全部。 :)
  • 假设输入是“fod,food,fad\nbar\nfoooood\n”,正则表达式是“fo*d”。那么输出应该是“fod\nfood\nfoooood\n”或“fodfood\n\nfoooood\n”。

标签: regex perl grep


【解决方案1】:

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

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

【讨论】:

  • 刚刚注意到grep -o 'fo*d' input.txt 似乎也可以正常工作。如有必要,可以使用--color=never 删除颜色。
【解决方案2】:

除非我误解了您的问题,否则以下方法可以解决问题

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

更多详情见:

【讨论】:

  • 它不应该打印整个匹配行。
  • ack -o 和 GNU grep -o 将只显示匹配的部分。将后者与 -P 结合起来,形成 Perl 风格的正则表达式。
【解决方案3】:

离开评论,并假设您通过管道或其他方式在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

【讨论】:

    【解决方案4】:
    perl -MSmart::Comments -ne '@a=m/(...)/g;print;' -e '### @a'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2016-11-04
      • 2012-03-25
      相关资源
      最近更新 更多