我有一个格式如下的文件:
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的评论,我还找到了一种简单的方法来解决grep
和cut
的问题,而不需要正则表达式:
grep -a -m1 'KEY1' file | cut -d """ -f2
返回
VALUE1