Perl程序一行命令蛔翅,可以替代grep+sed+awk胶惰;
一行式選項(xiàng)
-e 表示后面接perl的一行式表達(dá)式哎迄; -p 表示print操作谭贪,即對(duì)每一讀入的行在經(jīng)過表達(dá)式操作后都默認(rèn)輸出蜡励; -n 表示處理文件但默認(rèn)不輸出處理后的行令花; -p -n都存在 -n和-p兩個(gè)選項(xiàng)會(huì)自動(dòng)讀取文件阻桅,-p會(huì)覆蓋-n; -l 在結(jié)合-n或-p使用的時(shí)兼都,會(huì)自動(dòng)對(duì)讀入的行移除尾隨換行符嫂沉,然后在輸出的時(shí)候自動(dòng)追加尾隨輸出分隔符; -i 原地修改、拷貝副本扮碧,類似sed的"-i"趟章; 特殊字符 $ 輸出行分隔符,類似awk的ORS慎王,它默認(rèn)為undef蚓土; $. 當(dāng)前處理行的行號(hào)。
例子
-
打印出符合要求的行
例子1
如果文件只有一列赖淤,也可以直接使用$_ perl -ne 'print if $_>1.3' disease.ratio.txt
全局將文件中的 you 替換為 me:
perl -pi -e "s/you/me/g" file
/g 表示全局替換
-e 參數(shù)允許執(zhí)行 Perl 代碼
-p 參數(shù)確保處理文本的每一行并且將處理后的結(jié)果打印出來
-i 參數(shù)將修改的結(jié)果應(yīng)用到文件中(所以看不到 -p 打印的內(nèi)容了)
-i[extension] edit <> files in place (makes backup if extension supplied)
注意蜀漆,實(shí)際測(cè)試 -i 參數(shù)必須提供擴(kuò)展名以備份文件,否則提示:Can't do inplace edit without backup.
perl -pi.bak -e "s/you/me/g" file
處理多個(gè)文件:
perl -pi.bak -e "s/you/me/g" file1 file2 file3
僅處理含有"we"的行:
perl -pi.bak -e "s/you/me/g if /we/" file
打印文件中重復(fù)出現(xiàn)的行:
perl -ne "print if _}++" file
$_ 表示當(dāng)前遍歷的行的內(nèi)容
-n 表示遍歷所有行(類似 -p 但不負(fù)責(zé)打印結(jié)果)
執(zhí)行后將自動(dòng)建立字典 %a漫蛔,當(dāng) a{$_} 還是 undef(同0),+1在下次生效莽龟。再次出現(xiàn)時(shí)為1蠕嫁,打印輸出,以此類推毯盈。
添加并打印行號(hào):
perl -ne "print "_"" file
在 Perl 中剃毒,_ = "
_"" file
帶行號(hào)赘阀,但僅顯示重復(fù)行
perl -ne "print "" if
}++" f.txt
借用 List::Util 模塊統(tǒng)計(jì)每行中出現(xiàn)的數(shù)字的和
perl -MList::Util=sum -alne 'print sum @F' f.txt
說明:
-MList::Util 導(dǎo)入 List::Util 模塊
=sum 表示導(dǎo)入 List::Util 的 sum 函數(shù)
-a 參數(shù),自動(dòng)按空格劃分行的內(nèi)容并保存到 @F脑奠,使單詞基公、數(shù)字獨(dú)立出來
注 -F/pattern/ 參數(shù)可指定其他劃分規(guī)則
-l 參數(shù)確保每一次輸出都換行,省了手動(dòng) "\n"
讓時(shí)間回退到 1299 天前:
perl -MPOSIX -le "@t = localtime; $t[3] -= 1299; print scalar localtime mktime @t"
實(shí)際時(shí)間:
Wed Apr 26 19:31:22 2017
輸出:
Sat Oct 5 19:31:22 2013
這個(gè)過程實(shí)際就是 用 @t 獲取 localtime 的返回結(jié)果(數(shù)組環(huán)境)宋欺,將日期減1299(在數(shù)組成員中會(huì)變成負(fù)數(shù))轰豆,再使用 mktime 將其封裝,返回給 localtime齿诞,再用標(biāo)量環(huán)境打印 localtime 的返回值
如何生成8位隨機(jī)字符密碼酸休?map 走起:
perl -le "print map { ('a'..'z')[rand 26] } 1..8"
1..8 產(chǎn)生數(shù)組數(shù)字從 1-8,關(guān)鍵是產(chǎn)生8次循環(huán)
('a'..'z') 產(chǎn)生數(shù)組元素a-z祷杈,而 [rand 26] 隨機(jī)產(chǎn)生數(shù)組下標(biāo)斑司,也就是隨機(jī)選取字母
map 返回每一次循環(huán)的處理結(jié)果
要我寫的話可能會(huì)用 grep ,逐個(gè) print
perl -e "grep { print (('a'..'z')[rand 26]) } (1..8)"
發(fā)現(xiàn) print ('a'..'z')[rand 26] 會(huì)提示語(yǔ)法問題但汞,必須外加括號(hào)。
累計(jì)文本中每行的首列數(shù)字的和
perl -lane "F[0]; END { print $sum }" f.txt
END {} 定義了一個(gè)代碼塊,該代碼塊在腳本結(jié)束時(shí)運(yùn)行
如果對(duì) perl 的任一項(xiàng)參數(shù)有疑惑,可以參考
perldoc perlrun
其他參考
perldoc perlvar - 關(guān)于 Perl 的特殊變量
perldoc perlop - 操作符
perldoc perlfunc - 函數(shù)
Chapter 2 - 換行和間隔符
在每行的末尾增加空白行
perl -pe "$="\n"" f.txt
之前對(duì) -p 和 -e 參數(shù)做過簡(jiǎn)要的說明,以上代碼相當(dāng)于:
while (<>) {
!\n";
}
構(gòu)成
-p 參數(shù)建立 while (<>) {} continue { print } 循環(huán)結(jié)構(gòu)
在 while 循環(huán)內(nèi)默認(rèn)用 _
-e "代碼" 對(duì)應(yīng) while 循環(huán)內(nèi)的代碼。
continue 語(yǔ)句塊在 while 的每次循環(huán)末尾繼續(xù)執(zhí)行忧侧,
特點(diǎn)是 continue {} 的代碼不會(huì)因?yàn)?next 而跳過
特殊變量 \ 的內(nèi)容將自動(dòng)追加到
\ 賦相同的值是不必要的懊纳,
將其放在 BEGIN 代碼塊可以節(jié)省開銷(BEGIN代碼塊優(yōu)先執(zhí)行):
perl -pe "BEGIN { $="\n" } " f.txt
相當(dāng)于:
BEGIN { !\n";
}
其他方案
通過 "." 操作符添加換行:
perl -pe "$_ .= "\n"" f.txt
或者使用s///正則替換:
perl -pe 's/$/\n/' f.txt
甚至可以利用 say 操作符的特性(Perl 5.10 或以上):
perl -nE 'say' f.txt
-E 參數(shù)允許打開所有 Perl 的可選特性(為了支持 say 操作符)
-n 參數(shù)類似 -p 揉抵,遍歷所有讀入的行但不主動(dòng) print(前面介紹過了)
say 操作符類似 print,但 say 總是在每行的末尾添加 "\n"
最后嗤疯,別忘了多用 perldoc, 執(zhí)行 perldoc perlrun 查看perl命令行參數(shù)的詳細(xì)說明
換行加倍冤今,空行除外
perl -pe "/" f.txt
unless 在 perl 中是 if not 的意思
/^$/ 表示行的開頭和末尾之間沒有其他字符
也可以用 \S 篩選:
perl -pe "$_ .= "\n" if /\S/" f.txt
\s 代表一系列空白符號(hào)
\S 表示空白以外的字符
如果一行中包含空給以外的字符,則追加 \n
三倍換行符
相信各位已經(jīng)能舉一反三茂缚,不解釋了(后面的命令行示例省去文件名部分)
perl -pe "$\ = "\n\n""
perl -pe "$_ .= "\n\n""
perl -pe "s/$/\n\n/"
N倍換行符
Perl 使用 "字符"x數(shù)字 的方式對(duì)字符串翻倍疊加戏罢,例如7個(gè)換行符:"\n"x7
在每行之前添加空行
使用正則替換向文件開頭插入\n:
perl -pe 's/^/\n/'wc
刪除空白行
perl -ne 'print unless /^$/'
由于這里要自己判斷(篩選)輸出,所以使用 -n 而非 -p
鏈接:
https://www.cnblogs.com/paktc/p/6855005.html
https://www.jb51.net/article/55264.htm