Perl
用於替換可能由空格分隔的兩個連續字元串的實例的正則表達式
我想編寫一個 perl 單行程式碼,它替換兩個特定連續字元串的每個實例,這些字元串可能被空格分隔,也可能不被空格分隔。
例如,假設我的兩個字元串是
john paul
andgeorge
並且我想用 . 替換這些字元串的連續實例(按此順序)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 # ^^^^^
perl
’s-n
和-p
options 在你的程序周圍放置變體while (<>) { ... }
,這使得它們可以逐行處理輸入。如果要跨多行替換,則需要將整個內容讀入一個字元串,這需要您自己完成。perl -e 'local $/;$_=<>;s/john paul\s*george/pete/g;print'
這將取消定義
$/
記錄分隔符,以便<>
slurping不再進行行拆分,$_
一次讀取整個輸入,然後對該長字元串進行替換。你也必須自己列印。這裡不再有什麼神奇之處——它只是以一種有點不舒服的方式編寫一個完整的 Perl 程序。
-i
不過,仍然適用於就地更換。如果您有一個大文件,這將是相當低效的(或耗盡您的記憶體),但如果沒有建構更好的解析器,這似乎或多或少是不可避免的。您還可以查看
perldoc -q 'entire file'
其他替代方案,並告訴您很多您並不是認真的。