我有一个文件“test.txt”,其中包含:
Val1 = '59'
Val2 = '76'
Val3 = '42'
Val4 = '53'
我使用这个命令:
perl -pe "s/^Val2 = '(.*)'/\1/" test.txt
我想:
76
但我得到:
Val1 = '59'
76
Val3 = '42'
Val4 = '53'
答案1
该-p
参数类似于 sed 的默认打印 - 也像 sed 一样,如果您想抑制默认打印,则可以使用它-n
。
所以你可以
perl -ne "print if s/^Val2 = '(.*)'/\1/" test.txt
你也可以使用正则表达式匹配而不是正则表达式代替:
perl -lne "print \$1 if /^Val2 = '(.*)'/" test.txt
或者
perl -nE "say \$1 if /^Val2 = '(.*)'/" test.txt
(反斜杠是为了防止$1
被 shell 扩展,因为表达式用双引号引起来,以便允许在匹配中使用真实的单引号)。
答案2
使用这个 Perl 单行命令:
perl -lne "print for /^Val2\s+=\s+'(.*)'/" test.txt
它稍微短一些,并且不需要转义任何变量,因为循环for
将捕获的组隐式地传递给(.*)
,print
这$_
是 的默认参数print
。
它还使用“ \s+
”(1 个或多个空格字符)而不是“ ”(1 个空白)来降低对所接受输入的限制。虽然这是可选的,但我更喜欢遵循对输入限制较低、对输出限制较高的规则(不过不确定此规则的来源)。
Perl 单行命令使用下列命令行标志::
-e
告诉 Perl 在行内查找代码,而不是在文件中。
-n
:一次循环输入一行,$_
默认将其分配给。 :在行内执行代码之前
-l
删除输入行分隔符(默认在 *NIX 上),并在打印时附加它。"\n"
也可以看看:
perldoc perlrun
:如何执行 Perl 解释器:命令行开关
perldoc perlre
:Perl 正则表达式 (regexes)
perldoc perlre
:Perl 正则表达式 (regexes):量词;字符类和其他特殊转义;断言;捕获组
perldoc perlrequick
:Perl 正则表达式快速入门