前回の記事ではエントリーへのgrepを行いました、今回はそのsed版です。
今までは、ファイルやディレクトリへのfind、ファイルへのgrepとなっていましたが、sedではgrep -nの結果から、置換したい行を選択してsedができます。
おそらくLinuxコマンドを直接叩く場合は実現が困難な機能になると思います、PPx様様です。
デモ
sedメニューの場合は何をやったか分かりやすいように、PPbにコマンド内容も表示するようにしています。
sedメニューを実行すると、まずエントリーがファイル名か、grep -nの行単位の検索結果なのかを判別します、ファイル名ならばそのファイルを置換し、grep -n結果ならば選択行のみを置換します。
nkfはおまけです、選択したファイルの文字コードを変換します。
ツール構成
今回はsedとRubyのワンライナーを使ってるだけなので、それらの環境さえあれば動作します。
なお、ワンライナーをRubyで書いているのは、エスケープ文字の展開をして欲しくなかったためです、gawkだと文字列内のエスケープ文字が展開されてしまうため、正規表現を利用した際に不都合がありました。
PPx設定
差分のみです。
※自身の設定が消えないように、適用前にバックアップを取るか、追加取り込みをしてください
※スクリプトのパスは自身の環境へと合わせて下さい
KC_main = { ; PPcメイン窓
^R ,%M_menuCustomReplace
}
M_menuCustomReplace = { ** comment **
&sed(ファイル、行単位自動判別) =
*set dummy='エントリへのsed(ファイル、行単位自動判別)'
*set ENTRY_FILE=%'temp'\entryfile.tmp
*set ARG=%"sedオプション([行]s/src/dest/g)"%{%|src%|/%}
*set CMD=ruby -ne "a=$_.split(':'); fmt=\"sed -i -e '\"+'%%ss/%'ARG'/g'+\"' %%s\"; if a[1] =~ /^\d+$/; cmd=sprintf(fmt,a[1],a[0]); puts '$ '+cmd; system cmd; else; cmd=sprintf(fmt,'',a[0]); puts '$ '+cmd; system cmd; end"
*script %0\script\entry2file.js, %'ENTRY_FILE'
%OBsq cat %'ENTRY_FILE' | nkf -Lu -w | %'CMD'
n&kf =
*set dummy='エントリへのnkf'
*set ENTRY_FILE=%'temp'\entryfile.tmp
*set ARG=%"nkfオプション(-w:utf8,-s:Shift_JIS,-Lu:LF,-Lw:CRLF)"%{-%|w%|%}
*set CMD=ruby -ne "cmd='nkf %'ARG' --overwrite '+$_; puts '$ '+cmd; system cmd"
*script %0\script\entry2file.js, %'ENTRY_FILE'
%OBsq cat %'ENTRY_FILE' | nkf -Lu -w | %'CMD'
}
Rubyのワンライナーが読み辛いので、ここだけ別途解説します。
a=$_.split(':') # -nオプションで実行してるので、行毎の文字列が入ってる
fmt="sed -i -e '" + '%%ss/%'ARG'/g' + "' %%s"
#fmt="sed -i -e '%%ss/%'ARG'/g' %%s" # XXX これはダメ、エスケープが展開される
if a[1] =~ /^\d+$/
# 「:」分割でき、かつ行番号があった(= grep -n結果)
cmd=sprintf(fmt,a[1],a[0])
puts '$ '+cmd
system cmd
else
# それ以外(= find or grep -l結果)
cmd=sprintf(fmt,'',a[0])
puts '$ '+cmd
system cmd
end
判別方法はエントリー文字列を「:」で分割出来たかで判別しています、「:」はファイル名にする事ができないので、この方法でfind/grep -l結果、grep -n結果の処理を切り替えられています、ただ単純な判定のため、それ以外のエントリー文字列が渡されるとsedに失敗します、その時はPPbに失敗内容が表示されます。
まとめ
これでfind、grep、sedとソース編集時の基本コマンドが出揃いました、PPxにそれらを集められたので、エディタやIDEが変わってもPPxさえあれば何とかなるんじゃないかなと思います!1
-
そう言いつつ僕はVimばっか使ってます。 ↩