2017-04-24 32 views
-1

嘗試選擇性地更改包含許多其他行的文件中的所有行。使用perl來選擇性地更換行

輸入:

abc 
    PASSWORD=123 
    xyz 

期望輸出;

abc 
    PASSWORD *redacted* 
    xyz 

這是我使用的perl單線程。我已經嘗試了一些變化,但結果並不如人意。

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

(注意-i.bak在Solaris上是必需的)。

我從劇本得到的是:

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

我不是在Perl的專家,但我有很多的文件在這裏做(* .conf文件),所以選擇Perl作爲工具。

回答

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選項會在循環結束時自動輸出$_,然後是原始行或我們的編輯版本。

4

由於-p表示打印,沒有理由再次使用print。下面以替換操作與*redacted*PASSWORD後取代一切:

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

$ variable =〜s/PASSWORD/PASSWORD redacted/g;

這將改變全局所需的行。