如何让我的Perl一行代码只显示文件中的第一个正则表达式匹配



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

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

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

我使用这个命令:

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

但结果是:

VALUE1VALUE2

EDIT

解决方案必须使用perl命令,因为系统中没有其他regex工具。

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

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

这是因为-n开关有效地将代码封装在while循环中。因此,如果模式匹配,则执行print,这成功并因此导致执行last。这将退出while循环。

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

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

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

您也可以使用sed:

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

p;q的意思是"打印"然后"退出">

仅用于注册,感谢@Andy Lester的评论,我还找到了一种简单的方法来解决grepcut的问题,而不需要正则表达式:

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

返回

VALUE1

最新更新