我怎样才能让我的 Perl 单行程序只显示文件中的第一个正则表达式匹配项?

How can I get my Perl one-liner to show only the first regex match in the file?

我有一个格式如下的文件:

KEY1="VALUE1"
KEY2="VALUE2"
KEY1="VALUE2"

我需要一个 perl 命令来只获取第一次出现的 KEY1,即 VALUE1.

我正在使用这个命令:

perl -ne 'print "" if /KEY1="(.*?)"/' myfile

但结果是:

VALUE1VALUE2

EDIT

解决办法必须用perl命令,因为系统没有其他正则表达式工具。

像这样将 and last 添加到您的一行(删除多余的引号):

perl -ne 'print  and last if /KEY1="(.*?)"/' myfile

之所以有效,是因为 -n switch 有效地将您的代码包装在 while 循环中。因此,如果模式匹配,则执行 print,这会成功并因此导致执行 last。这将退出 while 循环。

您还可以使用更详细的 last LINE,它指定迭代输入行的 while 循环的(隐式)标签。最后一种形式适用于比这里更复杂的代码,例如涉及嵌套循环的代码。

您可以在打印第一个匹配项后退出:

perl -ne '/KEY1="([^"]*)"/ && print ( . "\n") && exit' file

VALUE1

您也可以使用 sed:

sed -nE 's/^KEY1="(.*)"//p;q' file

p;q表示'print'然后'quit'

仅供注册,感谢 @Andy Lester 的评论,我还找到了一种无需正则表达式即可解决 grepcut 问题的简单方法:

grep -a -m1 'KEY1' file | cut -d "\"" -f2

return

VALUE1