Perl

用於替換可能由空格分隔的兩個連續字元串的實例的正則表達式

  • August 12, 2016

我想編寫一個 perl 單行程式碼,它替換兩個特定連續字元串的每個實例,這些字元串可能被空格分隔,也可能不被空格分隔。

例如,假設我的兩個字元串是john paulandgeorge並且我想用 . 替換這些字元串的連續實例(按此順序)pete。執行單線

$ cat ~/foo

john paulgeorge
john paul george
john paul

   george

george john paul

應該導致

$ cat ~/foo

pete
pete
pete

george john paul

我唯一想到的是

$ perl -p -i -e 's/john paul\s*george/pete/g' ~/foo

但這會導致

$ cat ~/foo

pete
pete
john paul

   george

george john paul

有沒有辦法改變我的單線?

您唯一需要添加到單行的選項是將文件作為單個字元串啜飲:

perl -0777 -p -i -e 's/john paul\s*george/pete/g' ~/foo
#    ^^^^^

請參閱http://perldoc.perl.org/perlrun.html#Command-Switches

perl’s-n-poptions 在你的程序周圍放置變體while (<>) { ... },這使得它們可以逐行處理輸入。如果要跨多行替換,則需要將整個內容讀入一個字元串,這需要您自己完成。

perl -e 'local $/;$_=<>;s/john paul\s*george/pete/g;print'

這將取消定義$/記錄分隔符,以便<>slurping不再進行行拆分,$_一次讀取整個輸入,然後對該長字元串進行替換。你也必須自己列印。

這裡不再有什麼神奇之處——它只是以一種有點不舒服的方式編寫一個完整的 Perl 程序。-i不過,仍然適用於就地更換。

如果您有一個大文件,這將是相當低效的(或耗盡您的記憶體),但如果沒有建構更好的解析器,這似乎或多或少是不可避免的。您還可以查看perldoc -q 'entire file'其他替代方案,並告訴您很多您並不是認真的。

引用自:https://unix.stackexchange.com/questions/255612