一語中的


關於 perl 命令列上的各種 options, 例如 -a 是什麼意思, 請參考 perlrun(1)

例: 印出系統中每位使用者自己提供的公開資訊: perl -F: -nae 'printf "%-8s | $F[4]\n", $F[0]' /etc/passwd 這裡的 -a 及 -F: 是指: 對讀進來的每一列, 以 : 為欄位分隔符號, 進行自動拆解, 彷彿自動加了一句: @F = split /:/;

例: 想比對的字串, 在一列上出現多次, 可以全部抓出來, 而不要只抓每列的第一個符合字串嗎? 例如想將一個網頁 abc.html 內所有網址全部抓出來: perl -ne 'print join("\n",@x),"\n" if (@x=m#href="(.*?)"#g)' abc.html 因為比對 (m#...#) 的時候, 後面加上 g, 且傳回值存入陣列, 所以會把一列上所有合乎條件的字串, 逐個放入陣列當中。 印出來的時候, 用換列字元把陣列中的字串接起來, 每個網址單獨印在一列, 看起來比較整齊, 也比較方便後續處理。

例: 一次設定許多帳號的密碼perl -ne 'chomp; print "$_:", join("",reverse split //), "\n"' names | chpasswd 不過這個例子不好... 這種密碼不安全。

例: Debian 套件管理: 誰佔了多少空間?perl -000 -ne 'printf "%6d $1\n",$2 if /^Package:\s*(.*?)\n.*?^Status:[^\n]*\sinstalled\n.*?^Installed-Size:\s*(\d+)/ms' /var/lib/dpkg/status | sort -n > by-size.txt

status 的內容長得像 這樣

其實有指令可以直接查: dpkg-query -Wf '${Installed-Size;6} ${Package}\n' 詳見 man dpkg-query

例: 「課表 ==> 課表」 HTML entity 轉換

有時候某些軟體產生的 html 檔案, 裡面的中文用 html entity 表示, 例如 「課表」 這兩個字變成 「課表」。 如何將它轉換成普通文字編輯器 (例如 vim 或 nano) 可以編輯的檔案呢? 請把上面兩個 html entity 剪貼到一個文字檔, 叫做 sched.html 好了。 perl -pe 's/\&#(\d+);/chr($1)/eg' sched.html | u8tob5 > sched-big5.html 轉完之後記得進去把編碼 (charset 欄位) 從 utf-8 改成 big5。

其他類似文章:

  1. Unix Review > Perl Is a Gem: One-Liners and Programs
  2. The top 10 tricks of Perl one-liners
  3. Useful One-Line Scripts for Perl