bash --> perl 命令:仅打印替换的文本

bash --> perl 命令:仅打印替换的文本

我有一个文件“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 正则表达式快速入门

相关内容