【perl腳本】perl one line的幾個有趣實例1

前言

作爲一個萌新,最近癡迷於各種一行式腳本,比如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塊;

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章