我怎样才能让我的 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 的评论,我还找到了一种无需正则表达式即可解决 grep
和 cut
问题的简单方法:
grep -a -m1 'KEY1' file | cut -d "\"" -f2
return
VALUE1
我有一个格式如下的文件:
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 的评论,我还找到了一种无需正则表达式即可解决 grep
和 cut
问题的简单方法:
grep -a -m1 'KEY1' file | cut -d "\"" -f2
return
VALUE1