前言
作爲一個萌新,最近癡迷於各種一行式腳本,比如sed/grep/awk等,這次來探究下perl一行腳本的幾個有趣實例;
關於perl one line的語法規則,直接看這位大神的博客就好:
https://www.cnblogs.com/f-ck-need-u/p/10219326.html
實例中用到的兩個test文件內容如下:
實例1:文本替換
perl -pi -e 's/begin/BEGIN/g' test1
作用:類似於sed操作,將文件test1中的begin替換爲BEGIN,直接修改原文件;
-pi:等價於-p -i;
-p/-n:使用<>將所有@ARGV參數當作文件來執行,例如例子中的test文件;-n、-p都可以被-e中的while(<>)
替代;-p一般會將每一行輸出,-n表示禁止默認的輸出;
不過在我的Ubuntu系統中,單獨使用-p時會輸出每一行信息,-pi或者-p -i時未輸出;
-i:in-place簡稱,原地修改文件,-i.tmp則會將原文件另存爲原名稱.tmp之後再修改原文件;
-e:將其後的字符串作爲腳本內容執行,如實例中的's/begin/BEGIN/g';
其他常用符號如-a -F -w請參考前言博客。
實例2:另存原文件之後修改文件
perl -pi.bak -e 's/BEGIN/begin/g' test1
作用:將原文件test1另存爲test1.bak,之後修改test1文件將BEGIN替換爲begin;
實例3:還是上面的例子,可以結合find一起使用
find ./ -name "test2" | xargs perl -pi.tmp -e "s/begin/BEGIN/g"
實例4:還是進行替換,替換you後面的內容;
perl -p -e 's/(you\s+).*/$1you_rep/g' test2
$1:perl語言中第一組正則匹配()中匹配的內容,在某些系統中可能需要使用\1;
實例5:按行倒敘整個文件;
perl -p -e 'print reverse <>' test1
因爲腳本中包含了print,就不要使用-p了;令我不解的是,這種情況下使用-p會導致程序無法退出,一直處於等待狀態,求大佬解答;
實例6:按段落(沒有空行即一個段落)倒敘整個文件;
perl -00e 'print reverse <>' test1
-00:以段落模式打開文件;
實例7:按字符倒敘整個文件;
perl -0777e 'print scalar reverse <>' test1
-0777一次性讀入整個文件;
注意實例5 6 7應避免使用-i,否則你將得到一個空的test1文件;如果想原文件寫入,不如使用下 > 吧;
實例8:顯示文件3~5行;
perl -ne 'print if 3 .. 5' test1
-n禁止默認的輸出,如果想要強制輸出,只能在-e表達式中自行指定輸出操作,例如print/say/printf。
實例9:顯示BEGIN - end之間的內容;
print -ne 'print if /begin/ .. /end/' test1
嗯?最後一個end消失了?根據我之前的測試,https://blog.csdn.net/moon9999/article/details/106484521,最後一個end應該不會消失纔對,難道是因爲我換了linux系統的原因?
實例10:刪除BEGIN END之間的內容;
實例11:在文章開頭加一段話;
歡迎添加我的微信~
實例12:在文章結尾加一段話;
注意eof和eof()的區別:前者找的是單一文檔的結尾,後者找的是整體執行的結尾;
實例13:在每行開始加行號;
但是同時加兩個文件會出問題:
這時候要這麼寫:
實例14:perl one line同樣支持BEGIN塊和END塊;