Perl ワンライナー メモ

複数行にまたがる文字列置き換え
例:

以下から
<select name="timezone">
<option value="a">...
<option value="b">...
<option value="c">...
</select>
ここまでをfooに置き換える。
以下は置き換えない。
<select name="other">
<option value="a">...
<option value="b">...
<option value="c">...
</select>

以下のスクリプトでok

perl -p -0777 -i.bak -e "s#<select name=\"timezone\"([^(</select)]|.)*?</select>#foo#s;s/\.htm/.php/g;" 
test.txt
---
<div>
abc
</div>
def
<div>
ghi
</div>
def
<div>
jkl
</div>
---

perl -p -0777 -i.bak -e "s#<div>.*?</div>#foo#gs;" test.txt
-0数字(8 進数)
レコードセパレータ ($/) を 8 進数で示す。
デフォルトセパレーターは改行

-00
パラグラフモード。
パラグラフとは連続した改行で区切られる文の固まり

-0777 セパレーターを無効にする。
すなわちファイル全体が1パラグラフになる

-最小マッチ
*? や、+? のように、量指定子のあとに?を置くことで最小マッチになる

-s
正規表現の「s」は、「.」を改行にもマッチさせるオプション。

-m
正規表現の「m」は、文字列中の改行を無視させるオプション。

DBの操作

perl -MDBI -e '$dbh = DBI->connect("dbi:mysql:<DB名>:<IPアドレス>", "ユーザ名", "パスワード",{RaiseError => 1, PrintError => 1} ); $dbh->do(qq{ SELECT NOW() }, undef, q{DONE}) || die $dbh->errstr;'

perl -MDBI -e '$dbh = DBI->connect("dbi:mysql:<DB名>:<IPアドレス>", "ユーザ名", "パスワード",{RaiseError => 1, PrintError => 1} ); $sth = $dbh->prepare(qq{ SELECT user_mail FROM user_table }) || die $dbh->errstr; $sth->execute(); while( @a = $sth->fetchrow_array() ){ print $a[0], "\n"; }'
  • sedのように使う
# echo 'abc abc abc' | perl -pe 's|abc|ABC|g;'
ABC ABC ABC
perl -le 'for (qx(ps awwux)){@F = split; print $F[1] if /$ARGV[0]/ and $F[1] != $$}'
# perl -MMIME::Base64 -e 'print encode_base64("yoshifumi1975");'
# perl -MMIME::Base64 -e 'print decode_base64("eW9zaGlmdW1pMTk3NQ==");'
  • AWK のように

a で、AWKのように入力の各フィールドをsplit して、@Fに自動で入れてくれる。

# chkconfig --list | perl -anle 'print $F[0];'
atd
crond
httpd
iptables
lm_sensors
network
postfix
snmpd
snmptrapd
sshd
syslog
sysstat