dyno2316 ロヒミフ perl VBA Excel 秀丸

ワンライナー

----------------------------------------------------
# '@'が含まれていない行を表示
perl -ne "print unless /@/" aaa.txt
----------------------------------------------------
# 10行ごとに出力
perl -ne "print unless ($. % 10)" INFILE.txt
----------------------------------------------------
# 可変長のレコードを固定長に変換
perl -lne "print pack('A80',$_)" vrec.txt > out.txt
----------------------------------------------------
# 最初の50行を表示
perl -pe 'exit if $. > 50' file
----------------------------------------------------
# 重複行を削除
perl -ne "print unless $line{$_}++" aaa.txt
perl -ne "next if $line{$_}++; print;" aaa.txt
----------------------------------------------------
# ipconfigコマンド出力から'Host','Address'のある行を抽出
ipconfig /all | perl -ne "print if (/Host/ || /Address/)" > c:¥temp¥aaa.txt
----------------------------------------------------
# カンマ区切りファイルの1番目と3〜5番目をコロン区切りで表示
perl -F, -lane "print qq|@F[0]:@F[2]:@F[3]:@F[4]¥n|" aaa.csv
----------------------------------------------------
# 引数で指定したところから拡張子plファイルを見つけて表示します
perl -MFile::Find -le "find {wanted=>sub {print if /¥.pl$/;}},$ARGV[0]"
----------------------------------------------------
# 指定されたページを取ってきて表示します。
perl -MLWP::Simple -e "getprint qq|http://www.fpu.ac.jp/|";
----------------------------------------------------
ワンライナーのオプション
-e : 引数に記述された内容を実行
-n : 引数全体がwhile(<>){...} に囲まれたように動作
-p :「-n」に加えてループの最後にprint文が実行
----------------------------------------------------------------------
# ファイル内の文字列を置換(正規表現可)
perl -pe "s/置換前/置換後/g" filename
----------------------------------------------------------------------
# filenameの「#で始まる行と行の途中からの#以降」と空白の行を削除
perl -pe "s/^¥s*#.*¥n$|#.*$|^¥s*$//" filename
----------------------------------------------------------------------
# grepのように使う
perl -ne "print if (/検索パターン/)" filename
----------------------------------------------------------------------
# ミリ秒表示のUTC時間を読みやすい形式に変換
perl -pe "s/^¥d+¥.¥d+/localtime $&/e" filename
----------------------------------------------------------------------
Perl ワンライナー&nbspTips

図16 複数コマンドでのワンライナー
$ &nbspperl&nbsp-e 'print "3の倍数¥n" &nbspfor (1..100) {if (($_ %&nbsp3) ==&nbsp0) {print $_&nbsp. "¥n" }}'
C:¥>perl&nbsp-e "print ¥"3の倍数¥n¥";&nbspfor (1..100) {if (($_ %&nbsp3) ==&nbsp0) {print $_&nbsp. ¥"¥n¥"}}"

図17 ファイル名の一覧を取得しコピーコマンド生成
$ &nbspls |&nbspperl&nbsp-ne 'chomp;&nbspprint "cp&nbsp-p $_ $_.old¥n"'
c:¥>dir /b |&nbspperl&nbsp-ne "chomp;&nbspprint ¥"copy /y $_ $_.old¥n¥""

図18 ファイルの一部分を表示する
$ &nbspperl&nbsp-ne 'print&nbspif&nbsp15&nbsp..&nbsp17' ファイル名
c:¥>perl&nbsp-ne "print&nbspif&nbsp15&nbsp..&nbsp17" ファイル名

図19 文字を置き換える
$ &nbspecho 'halllllo,&nbspworld' |&nbspperl&nbsp-pe 's/h[ae]l+o/hello/'
c:¥>echo "halllllo,&nbspworld" |&nbspperl&nbsp-pe "s/h[ae]l+o/hello/"

図20&nbsp-lオプションを利用して置き換え
$ &nbspls |&nbspperl&nbsp-nle 'print "cp&nbsp-p $_ $_.old"'
c:¥>ls |&nbspperl&nbsp-nle "print ¥"copy /y $_ $_.old¥""

図21 桁を指定して出力する
$&nbspls&nbsp-l |&nbspperl&nbsp-ane 'print "$F[4]¥t$F[8}¥n"'

図22&nbspCSV形式ファイルの特定カラムを抽出表示
$&nbspcat&nbsptest.csv
10,20,30
40,50,60

$&nbspperl&nbsp-F,&nbsp-alne 'print $F[1}'&nbsptest.csv

図23 ファイルの中身を置換する
$&nbspperl&nbsp-pi&nbsp-e 's/mae/saki/g' *.txt

図24 ファイルの中身を置換+バックアップを作成する
$&nbspperl&nbsp-pi.bak&nbsp-e 's/mae/saki/g'&nbsptext.txt

図25 ファイルの中身を置換+日付付バックアップを作成する
$&nbspperl&nbsp-pi.`date +%Y%m%d`&nbsp-e 's/mae/saki/g'&nbsptext.txt

図26&nbspWebの内容を取得する
$&nbspperl&nbsp-MLWP::Simple&nbsp-e 'print&nbspget("http://gihyo.jp")'

図27 画像ファイルのEXIF情報を取得する
$&nbspperl&nbsp-MImage::ExifTool&nbsp-e '$exif =&nbspnew&nbspImage::ExifTool->ImageInfo(shift);&nbspforeach (sort&nbspkeys %$exif) {&nbspprint("$_ : $exif->{$_}¥n");}'&nbsptest.jpg

図28&nbspBase64でエンコード・デコードする
$&nbspperl&nbsp-MMIME::Base64&nbsp-ne 'print&nbspMIME::Base64::encode_base64($_)' ファイル名
$&nbspperl&nbsp-MMIME::Base64&nbsp-ne 'print&nbspMIME::Base64::decode_base64($_)' ファイル名


-nオプション
&nbsp-eに−nオプションを付けることで,標準入力
から読み込んで,その内容に対して処理を行うよ
うになります.


●ファイル名の一覧を取得しコピーする
図17は,lsコマンドでファイル名を出力し,
そのファイル名をコピーするシェルスクリプトを
表示する例です.


●ファイルの一部分を表示する
図18は,ファイル名の15〜17行目を表示し
ます.「15‥17」は,入力ファイル内の現在の行
番号を意味する$.変数に対して評価され,結果と
して15〜17行目が表示されます.


-pオプション
&nbsp-nオプションと同様に,標準入力から読み込ん
だ内容に対して処理を行います.−nと異なるのは,
処理結果を標準出力に出力する点です.フィルタ
として利用すると便利です.


●文字を置き換える
図19では,文字列の置き換えに正規表現を使っ
ています.「s/」は,「s//演算子」と呼ばれ,
スラッシュで区切られた前半部分を後半部分へ置換しま
す.図19では,正規表現のhlae11+0をhelloへ置
き換えることを意味します.


-lオプション
&nbsp-lオプションを-nと-pに組み合わせて利用す
ると,処理を行う前に標準入力に対してchompを
実行します.また,出力に対して強制的に改行を
行います.
図17のファイルをコピーするスクリプトを出
力する例を図20として書き直しました
&nbspChompと¥nがなくなり,シンプルになりました.


-aオプション
&nbsp-aオプションは,テキスト1行を空白文字で分割し,
分割した結果を@Fという特別な配列に入れます.
おもに-nもしくは-pと組み合わせて利用します.
配列@Fの添字はゼロから始まります.


●任意の桁を抽出して出力する
図21では,5桁目と9桁目を抽出して出力して
います.


-Fオプション
&nbsp-aオプションに−Fオプションを組み合わせる
と,@Fに分割する際の区切りとなる文字を変更
できます.

●CSV形式のファイルの特定のカラムを抽出して表示
図22では,-Fの後にカンマを記載することで,
カンマ区切りで@Fに入れています.csvファイル
から2桁目を抽出して表示しています.


-iオプション
&nbsp-iオプションは,ファイルを置換します.

●ファイルの中身を置換する
図23では,拡張子txtのファイル中にある文字
列&nbspmae を&nbspsaki に置換し,ファイルそのものも置き
換えています./gを付けることで,1行に複数の
文字列があっても,すべてを置換するようになり
ます.ファイルの中身を一括して置換したいこと
は多くありますが,Perlワンライナーで実行でき
ます.

●ファイルの中身を置換する際にバックアップを作成する
図24では,-iの引数として文字列を指定する
ことで,元ファイルのバックアップを取得してい
ます.元ファイルに「.bak」との拡張子を付けて
保存します.結果として,test.txt の中身は文字列
&nbspmae が文字列&nbspsaki に置換され,元ファイルは
&nbsptest.bak として保存されます.

●ファイルの中身を置換する際に日付を入れたバック
アップを作成する
ワンライナーもシェルからの実行に過ぎないた
め,シェルのバッククォートとの連携も使えます・
図25は&nbspdate コマンドの出力を利用する例です.
&nbsptest.txt の中身は図24と同様に置換され,
&nbsptest.txt.20090318 のように,実行した日付が保存され
ます.

&nbspCPANを使ったワンライナー
&nbspCPANの機能をワンライナーからも利用するこ
とができます.Perlのワンライナーから呼び出す
ことで,CPANの機能をあたかもOSのコマンド
であるかように利用できます.

-Mオプション
&nbsp-Mオプションは,実行する際にPerlモジュー
ルを指定します.−Mの後にそのままPerlモジュー
ル名を記載します.たとえば,LWP::Simple を利
用する場合は,「-MLWP::Simple」と指定します.


●Webの内容を取得する
図26のようにすると,Webの内容を取得する
ことができます.

●画像ファイルのEXIF情報を取得する
図27では,画像ファイルのEXIF情報を取得
しています注2

●Base64でエンコード/デコードする
&nbspBase64のエンコード/デコードは何かと使う機
会がありますが,図28のようにモジュールを使っ
てワンライナーで記載できれば便利です.


=============================================================================