纯粹为了使用正则表达式而用 perl 补充 shell 脚本是个好主意吗?

纯粹为了使用正则表达式而用 perl 补充 shell 脚本是个好主意吗?

我正在寻找一种在 UNIX shell 脚本中使用正则表达式的简单方法,其中并非每个系统都将 perl 扩展内置到 grep 中。这里关于 perl regex 真正有用的是后退/前进引用,我还没有找到在 sed 中有效使用的方法。我很快就想出了以下 1 行:

tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'

Q1.这是为 Perl 做事的安全方法吗? Q2。我应该用 perl 编写整个脚本吗?

答案1

我不明白为什么你的 perl 代码片段是这样写的。您可以直接在脚本中编写正则表达式:

perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'

这允许您利用该-n选项(作为奖励,您可以在出现输入错误时获得正确的错误报告)。进一步使用 Perl 习惯用法:

perl -ne 'print if /my regex/'

Sed 有反向引用,但 Perl 的扩展正则表达式更强大,有些事情你不能用 sed 做(sed 甚至没有完整的正则表达式:交替不是\|标准功能,尽管许多实现都有它)。

使用传统工具可以完成的大部分工作,都可以在 Perl 中轻松完成。例如,如果你想跳过前K-1个字节,你可以写

perl -ne 'BEGIN {read ARGV, "", 42-1}; …'

如果您想要可移植性,很多文本处理任务可以在 awk 中完成,但 awk 根本没有反向引用,因此从字符串中提取文本可能会很笨拙。

相关内容