将grep正则表达式转换为Perl或AWK

8
我一直使用Linux环境,最近迁移到Solaris。不幸的是,我的一个bash脚本需要使用带有P开关[pcre支持]的grep。由于Solaris不支持greppcre选项,我被迫寻找另一种解决方案。而且pcregrep似乎存在明显的循环错误,sed-r选项也不支持!我希望在Solaris上使用perlnawk来解决问题。
我还没有在我的脚本中使用过perl,对其语法和标志也不熟悉。
既然涉及到pcre,我相信一个perl脚本编写者可以在几分钟内帮我解决问题。他们应该能够匹配多行。
就效率而言,哪个解决方案更好,awk还是perl
感谢回复。

2
你尝试过在Perl中使用正则表达式吗?这值得一试,因为名称“pcre”确实表明了某种Perl兼容性。 - matthias krull
你是否检查了你的系统是否安装了GNU grep,并且位于类似/usr/gnu/bin/usr/sfw/bin/usr/local/bin/opt/csw/bin等其他路径下?如果是的话,你只需要更改脚本中grep的路径,而不是重写为新命令。 - alanc
2个回答

5
这些是一些您可能需要的grepperl转换: grep -P PATTERN FILE(s) ---> perl -nle 'print if m/PATTERN/' FILE(s) grep -Po PATTERN FILE(s) ---> perl -nle 'print "$1\n" while m/(PATTERN)/g' FILE(s) 这是我猜测您要找的内容,如果grep -P不可行。

你的意思是 perl -nle 'print if /PATTERN/' FILES - tchrist
谢谢,是的,我刚做了一些测试并得出了这个结论!下次,随意编辑。 - kevlar1818
我认为第二个更应该是这样的:perl -nle 'print $1 while /(PATTERN)/g' - Dimitre Radoulov
我也更喜欢使用 perl -nlE 'say $1 if /(PATTERN)/' FILE 作为第二种简洁的选择。 - zostay
perl -0777pe 'print $1 while /(pattern with\nnewlines)/g'。另请参阅/m和/s选项,尽管我想它们应该在PCRE领域很熟悉了。这里的基本问题是Perl默认情况下一次只在一个输入行上运行脚本。 - tripleee
显示剩余4条评论

2

以下是简短的内容:

 grep -P /regex/ ====> perl -ne 'print if /regex/;'
  • -n参数将文件的每一行作为输入。Perl循环遍历整个文件时,每一行都被放入一个特殊的perl变量$_中。
  • -e参数表示Perl程序在命令行上而不是通过传递文件运行。
  • 如果你不指定要打印出其他内容,Perl的print命令会自动打印出$_中的任何内容。
  • if /regex/将正则表达式与$_变量中的文件行进行匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接