Perl之單行命令特技

替換

將所有C程序中的foo替換成bar,舊文件備份成.bak

perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c

很強大的功能,特別是在大程序中做重構。記得只有在UltraEdit用過。 如果你不想備份,就直接寫成 perl -p -i -e 或者更簡單 perl -pie, 恩,pie這個單詞不錯

將每個文件中出現的數值都加一

perl -i.bak -pe 's/(\d+)/ 1 + $1 /ge' file1 file2 ....

將換行符\r\n替換成\n

perl -pie 's/\r\n/\n/g' file

同dos2unix命令。

將換行符\n替換成\r\n

perl -pie 's/\n/\r\n/g' file

同unix2dos命令。

取出文件的一部分

顯示字段0-4和字段6,字段的分隔符是空格

perl -lane 'print "@F[0..4] $F[6]"' file

很好很強大,同 awk 'print $1, $2, $3, $4, $5, $7'。參數名稱lane也很好記。

如果字段分隔符不是空格而是冒號,則用

perl -F: -lane 'print "@F[0..4]\n"' /etc/passwd

顯示START和END之間的部分

perl -ne 'print if /^START$/ .. /^END$/' file

恐怕這個操作只有sed才做得到了吧……

相反,不顯示START和END之間的部分

perl -ne 'print unless /^START$/ .. /^END$/' file

顯示開頭50行:

perl -pe 'exit if $. > 50' file

同命令 head -n 50

不顯示開頭10行:

perl -ne 'print unless 1 .. 10' file

顯示15行到17行:

perl -ne 'print if 15 .. 17' file

每行取前80個字符:

perl -lne 'print substr($_, 0, 80) = ""' file

每行丟棄前10個字符:

perl -lne 'print substr($_, 10) = ""' file

搜索

查找comment字符串:

perl -ne 'print if /comment/' duptext

這個就是普通的grep命令了。

查找不含comment字符串的行:

perl -ne 'print unless /comment/' duptext

反向的grep,即grep -v。

查找包含comment或apple的行:

perl -ne 'print if /comment/ || /apple/' duptext

相同的功能就要用到egrep了,語法比較複雜,我不會……

計算

計算字段4和倒數第二字段之和:

perl -lane 'print $F[4] + $F[-2]'

要是用awk,就得寫成 awk '{i=NF-1;print $5+$i}'

排序和反轉

文件按行排序:

perl -e 'print sort <>' file

相當於簡單的sort命令。

文件按段落排序:

perl -00 -e 'print sort <>' file

多個文件按文件內容排序,並返回合併後的文件:

perl -0777 -e 'print sort <>' file1 file2

文件按行反轉:

perl -e 'print reverse <>' file1

相應的命令有嗎?有……不過挺偏,tac(cat的反轉)

數值計算

10進制轉16進制:

perl  -ne  'printf "%x\n",$_'

10進制轉8進制: perl -ne 'printf "%o\n",$_'

16進制轉10進制:

perl -ne 'print  hex($_)."\n"'

8進制轉10進制:

perl -ne 'print  oct($_)."\n"'

簡易計算器。

perl -ne 'print  eval($_)."\n"'

其他

啓動交互式perl:

perl -de 1

查看包含路徑的內容:

perl -le 'print for @INC'

備註

與One-Liner相關的Perl命令行參數:

-0<數字>
(用8進製表示)指定記錄分隔符($/變量),默認爲換行
-00
段落模式,即以連續換行爲分隔符
-0777
禁用分隔符,即將整個文件作爲一個記錄
-a
自動分隔模式,用空格分隔$_並保存到@F中。相當於@F = split ''。分隔符可以使用-F參數指定
-F
指定-a的分隔符,可以使用正則表達式
-e
執行指定的腳本。
-i<擴展名>
原地替換文件,並將舊文件用指定的擴展名備份。不指定擴展名則不備份。
-l
對輸入內容自動chomp,對輸出內容自動添加換行
-n
自動循環,相當於 while(<>) { 腳本; }
-p
自動循環+自動輸出,相當於 while(<>) { 腳本; print; }

轉自:http://deepfuture.iteye.com/blog/645247
發佈了31 篇原創文章 · 獲贊 7 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章