Landscape トップページ | < 前の日 2003-06-03 2003-06-04 次の日 2003-06-05 >

Landscape - エンジニアのメモ 2003-06-04

Perl one liner 集 perl 1行野郎


* Perl one liner 集 perl 1行野郎

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

- one liner、日本語で言うと一行野郎

いわゆる一行スクリプトを解説したページ。
昔はよく参照してたが、google をいくら探しても見つからない。
仕方がないので、ここに転載しておく。

- Internet Archive で見つけた。

「perl でいいよ」 というページの一コーナーだったようだ。
http://web.archive.org/web/20020214191434/http://www13.cds.n ...

ところで、なんで -a でスプリットされた変数へは @F[n] でアクセスするんだろう?
たまに中身がリファレンスだったりすることがあるし、よくわからん。
-w を付けると、$F[n] にしなさい、と言われるし。

●標準perlだけで使える1行野郎

[置き換え]
すべてのcのファイル中のfooをbarに置き換える。
bakでバックアップ付き
\bは単語の区切り
perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c

それぞれのファイルに含まれる数値を1増やしてセーブします
bakでバックアップ付
perl -i.bak -pe 's/(\d+)/ 1 + $1 /ge' file1 file2 ....

改行コードを0D0A から 0Aに変換します
perl  -pe  's/\015\012/\012/g' file

改行コードを0A から 0D0Aに変換します
perl  -pe  's/\012/\015\012/g' file



[部分的な取り出し]
スペースで区切られたフィールドの最初から4番目までと6番目を表示
perl -lane 'print "@F[0..4] $F[6]"' file

コロンで区切られたフィールドの最初から4番目までを表示
perl -F: -lane  'print "@F[0..4]\n"' /etc/passwd

STARTとENDに挟まれた部分を表示
perl -ne 'print if /^START$/ .. /^END$/' file

STARTとENDに挟まれた部分以外を表示
perl -ne 'print unless /^START$/ .. /^END$/' file

最初の50行を表示
perl -pe 'exit if $. > 50' file

最初の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



[よりよいgrep]
commentという文字列が含まれている行を表示
perl -ne 'print if /comment/' duptext
commentという文字列が含まれていない行を表示
perl -ne 'print if /comment/' duptext

commentまたはappleという文字列が含まれている行を表示
perl -ne 'print if /comment/ || /apple/' duptext

commentまたはappleという文字列が含まれている行を表示
perl -ne 'print if /comment/ || /apple/' duptext

commentとappleの両方の文字列が含まれている行を表示
perl -ne 'print if /comment/ || /apple/' duptext

commentという文字列が含まれている行とファイル名を表示
findと一緒に使うと便利
perl -ne 'print "$ARGV:$_" if /comment/' file1 file2 file3 ...

intにだけ一致する(printには一致しない)grep
perl -ne 'print if /\bint\b/' test.txt

port0からport9までの10個の単語に一致する
perl -ne 'print if /\bport\d\b/' test.txt

port0からport9999などといった数字が末尾につく単語に一致する
perl -ne 'print if /\bport\d+\b/' test.txt



[フィールド間の演算]
最初のフィールドと最後から2番目のフィールドを合計する
perl -lane 'print $F[0] + $F[-2]'



[ソート]
ファイルを行単位でソートします
perl  -e 'print sort <>' file

ファイルをパラグラフ単位でソートします
perl  -00 -e 'print sort <>' file

複数ファイルをファイル毎比較してソートしてから1本のファイルとして表示し
ます
perl  -0777 -e 'print sort <>' file1 file2



[反転]
あたえられたファイルを行単位でひっくり返します
perl -e 'print reverse <>' file1

ファイルを文字単位ですべてひっくり返します
perl -0777e 'print scalar reverse <>' f1 f2 f3 ...

ファイルをパラグラフ単位でひっくり返します
perl -00 -e 'print reverse <>' file1 file2 file3 ....

1行の中で文字単位でひっくり返します
perl -nle 'print scalar reverse $_' file1 file2 file3 ....

辞書から回文を探します。残念ながら日本語には対応していません
perl -lne 'print if $_ eq reverse' /usr/dict/words

ファイル中に2回以上連続して現れる単語があれば、そのうちの1個を表示しま

perl -0777 -ne 'print "$.: doubled $1\n" while /\b(\w+)\b\s+\b\1\b/gi'



[数値変換]
入力された10進数を16進数に変換して表示します。CTRL-Cで終了
perl  -ne  'printf "%x\n",$_'

入力された10進数を8進数に変換して表示します。CTRL-Cで終了
perl  -ne  'printf "%o\n",$_'

入力された16進数を10進数に変換して表示します。CTRL-Cで終了
perl -ne 'print  hex($_)."\n"'

入力された8進数を10進数に変換して表示します。CTRL-Cで終了
perl -ne 'print  oct($_)."\n"'

簡易電卓として計算できます。CTRL-Cで終了
perl -ne 'print  eval($_)."\n"'



●-Mは反則だろう。でも便利。モジュールな1行野郎

http://www.yahoo.co.jp/のページのソースを表示
perl -MLWP::UserAgent -e 'LWP::UserAgent->new->request(HTTP::Request->new('GET',$ARGV[0]),sub{print $_[0];});' http://www.yahoo.co.jp/

引数で指定したところからすべてのファイルを見つけて表示します
perl -MFile::Find -le 'find {wanted=>sub {print;}},$ARGV[0]'

カレントディレクトリからすべての拡張子plファイルを見つけて表示します
perl -MFile::Find -le 'find {wanted=>sub {print if /\.pl$/;}},$ARGV[0]'

ディレクトリを作ります。mkdirと違って深い階層を一度に作ることができま
す。
perl -MFile::Path -e 'mkpath([@ARGV],1,0777)' test/tmp1 test2/tmp2

Base64でエンコードします
perl -MMIME::Base64 -ne 'print &MIME::Base64::encode_base64( $_)' file

Base64でエンコードされたfileをデコードします
perl -MMIME::Base64 -ne 'print &MIME::Base64::decode_base64( $_)' file

Quoted-Printable でエンコードします(参照 RFC 2045 )
perl -MMIME::QuotedPrint -ne 'print &MIME::QuotedPrint::encode_qp( $_)' file

指定されたページを取ってきて表示します。
perl -MLWP::Simple -e 'getprint "http://www.foo.bar.com/";

ftpでファイルをダウンロードします。
perl -MLWP::Simple -e 'getstore "ftp://ftp.sunet.se/pub/lang/perl/CPAN/src/latest.tar.gz","perl.tar.gz"'

httpドキュメントのミラーリング
perl -MLWP::Simple -e 'mirror("http://www.perl.com/", "perl.html");'



●一行野郎のためのオプション解説

-0数字(8 進数)
レコードセパレータ ($/) を 8 進数で示します。デフォルトセパレーターは改
行です

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

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

-a 自動splitモード
  配列 @F = split(' ');
  区切り文字は-Fで指定可能
  デフォルトは1文字スペース

-e
1行野郎のキーワード
コマンドラインにあたえられた文字列をperlのプログラムとして実行します
複数の-eを使うこともできますがセミコロンが必要

-i拡張子
.bakなどを指定することで、個々のファイルのバックアップを取って上書きし
ます。

-l数字(8 進数)
自動chomp
出力時に数字(8 進数)を改行コードに置き換える。


-n
自動ループ
  while (<>) {
          ... # ここでスクリプトが実行される
  }


-p
自動ループprint付
  while (<>) {
          ... # ここでスクリプトが実行される

  }

組み合わせ

-na -F正規表現
  while (<>) {
        @F=split(/正規表現/);
          ... # ここでスクリプトが実行される
  }

-pa -F正規表現
  while (<>) {
        @F=split(/正規表現/);
          ... # ここでスクリプトが実行される
        print ;
  }

- IBM developerWorks の Perl One liner 特集

洗練されたPerl: ワンライナー101 と ワンライナー102
http://www-6.ibm.com/jp/developerworks/linux/010706/j_l-p101 ...
http://www-6.ibm.com/jp/developerworks/linux/030523/j_l-p102 ...

- 速習 Perl: 1行スクリプト

http://infosys.gsid.nagoya-u.ac.jp/~ohna/perl_lesson/intro2p ...

すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。