Perl - ワンライナー

Mac で sed を使ってタブを空白4文字に置換しようと思って

cat file.txt | sed 's/\t/    /g'

としたら、文字 t が空白4文字になった。sed はもう使いません。Perl でやります。

cat file.txt | perl -pe 's/\t/    /g'

でおk。別に cat を使わず

perl -pe 's/\t/    /g' file.txt

でもいいんだけど、処理を少しずつやっている感じで cat を使った方がしっくりくる。
ついでに、文字コード utf8、 改行 LF にして、全角空白を半角空白2個に置換することも追加すると

nkf -w -Lu file.txt | perl -pe 's/\t/    /g; s/ /  /g'

となる。完璧。
Perl の一行だけで処理を書いてしまういわゆるワンライナーについては
Perl one liner 集 perl 1行野郎
404 Blog Not Found:perl - ワンライナーの書き方入門
に詳しく載ってる。-e は続く文字列を Perl の命令として解釈するものでワンライナー必須のオプション。他のオプションのうち -n, -p だけ説明すると

# -n は
while (<>) {
    # ここを実行
}

# -p は
while (<>) {
    # ここを実行、かつ次の一文が自動で付く
    print;
}

の意味。よって先程のタブを4つの空白に置換する perl -pe 's/\t/ /' file.txt は

while (<>) {
    s/\t/    /;
    print;
}

を引数 file.txt で実行したことに等しい。これだけでいろいろできる。例えば grep

perl -ne 'print if /word/' file.txt

と一緒。

今日の疑問

  • sed でタブを指定するには?
  • 今出回っている UNIX 系の OS にはすべて Perl が入っていると思っていいのか?