使用perl有选择地更改行

时间:2017-04-24 20:56:17

标签: perl

尝试有选择地更改包含许多其他行的文件中的所有行。

输入:

    abc  
    PASSWORD=123  
    xyz

期望的输出;

    abc
    PASSWORD *redacted*
    xyz

这是我正在使用的perl单线程。我尝试了一些变体,但结果并不理想。

perl -i.bak  -pe '{if (/PASSWORD/) {print  "PASSWORD *redacted*"}else {print "$_"}}' yme.conf

(注意Solaris上需要-i.bak)。

我从该脚本得到的是:

    abc
    abc
    PASSWORD=*redacted*   PASSWORD=123
    xyz
    xyz

我不是Perl的专家,但我有很多文件要做(* .conf),所以选择Perl作为工具。

3 个答案:

答案 0 :(得分:4)

由于-p表示打印,因此没有理由再次使用print。以下内容使用替换运算符替换单词PASSWORD后的所有内容*redacted*

perl -i.bak -pe 's/(PASSWORD).*/$1 *redacted*/' yme.conf

答案 1 :(得分:4)

您正在获得额外的输出,因为-p选项已自动打印$_。您可以使用-n来修改原始代码(并将\n添加到编辑后的字符串中):

perl -i.bak -ne 'if (/PASSWORD/) {print "PASSWORD *redacted*\n"} else {print $_}' yme.conf

使用-p

可以简化这一过程
perl -i.bak -pe 'if (/PASSWORD/) {$_ = "PASSWORD *redacted*\n"}' yme.conf

我们循环输入行,当前行存储在$_中。如果它包含PASSWORD,我们会覆盖它。 -p选项会在循环结束时自动输出$_,然后是原始行或我们的编辑版本。

答案 2 :(得分:-1)

$ variable = ~s / PASSWORD / PASSWORD 编辑 / g;

这将全局更改所需的行。