1. 程式人生 > >Perl一行式:文字編解碼、替換

Perl一行式:文字編解碼、替換

文字大小寫轉換

全部字元轉換成大寫或小寫,有幾種方式:

# 轉大寫
$ perl -nle 'print uc' file.log
$ perl -ple '$_ = uc' file.log
$ perl -nle 'print "\U$_"' file.log

# 轉小寫
$ perl -nle 'print lc' file.log
$ perl -ple '$_ = lc' file.log
$ perl -nle 'print "\L$_"' file.log

每行首字母大小寫轉換:

$ perl -nle 'print lcfirst' file.log
$ perl -lpe '$_ = ucfirst' file.log
$ perl -lne 'print \u\L$_' file.log

單詞首字母大寫,其它小寫:

$ perl -ple 's/(\w+)/\u$1/g' file.log

修剪字首、字尾空白

去掉字首空白的方式:

$ perl -ple 's/^\s+//' file.log

去掉字尾空白的方式:

$ perl -lpe 's/\s+$//' file.log

同時去掉字首和字尾空白:

$ perl -lpe 's/^\s+|\s+$//' file.log

反序輸出所有段落

$ perl -00 -e 'print reverse <>' file.log

前面的文章壓縮連續的空行解釋過,-00是按段落讀取且壓縮連續的空行。

reverse <>

中reverse的操作物件期待的是一個列表,所以<>會一次性讀取整個檔案且按照段落讀取,每個段落是列表中的一個元素。最後reverse函式反序這個列表,然後被print輸出。

反序輸出所有行

$ perl -e 'print reverse <ARGV>' file.log
sync   x 4 65534 sync   /bin      /bin/sync
sys    x 3     3 sys    /dev      /usr/sbin/nologin
bin    x 2     2 bin    /bin      /usr/sbin/nologin
daemon x 1     1 daemon /usr/sbin /usr/sbin/nologin
root   x 0     0 root   /root     /bin/bash

這裡reverse <ARGV>表示一次性讀取file.log的所有行並進行反轉。

也可以使用下面這種方式,但如果檔案結尾不正確(缺少eof),可能會卡住:

$ perl -e 'print reverse <>' file.log

ROT13字元對映

Perl中可使用tr///y///進行字元一一對映的替換。它們和unix下的tr命令作用類似。

$ perl -le '$string="hello";$string =~ y/a-zA-Z/N-Za-mA-Mn-z/;print $string'
URYYb

BASE64編碼、解碼

MIME::Base64模組提供了base64編碼、解碼的方法。

編碼:

$ perl -MMIME::Base64 -e 'print encode_base64("coding")'
Y29kaW5n

解碼:

$ perl -MMIME::Base64 -le 'print decode_base64("Y29kaW5n")'
coding

編碼檔案:

$ perl -MMIME::Base64 -0777 -ne '
    print encode_base64($_)' file.log

解碼檔案:

$ perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)' file

URL轉義

使用URI::Escape模組即可進行URL轉義。該模組需要額外安裝cpan URI::Escape

$ perl -MURI::Escape -le 'print uri_escape("http://example.com")'
http%3A%2F%2Fexample.com 

反轉義:

$ perl -MURI::Escape -le '
    print uri_unescape("http%3A%2F%2Fexample.com")'
http://example.com

HTML編碼、解碼

先安裝額外HTML格式的編解碼模組cpan HTML::Entities

$ perl -MHTML::Entities -le 'print encode_entities("<html>")'
$ perl -MHTML::Entities -le 'print decode_entities("&lt;html&gt;")'