Paper Plane xUI(PPx)からエントリーへのsed


前回の記事ではエントリーへのgrepを行いました、今回はそのsed版です。
今までは、ファイルやディレクトリへのfind、ファイルへのgrepとなっていましたが、sedではgrep -nの結果から、置換したい行を選択してsedができます。
おそらくLinuxコマンドを直接叩く場合は実現が困難な機能になると思います、PPx様様です。

デモ

sedメニューの場合は何をやったか分かりやすいように、PPbにコマンド内容も表示するようにしています。

sedメニューを実行すると、まずエントリーがファイル名か、grep -nの行単位の検索結果なのかを判別します、ファイル名ならばそのファイルを置換し、grep -n結果ならば選択行のみを置換します。

nkfはおまけです、選択したファイルの文字コードを変換します。

ツール構成

今回はsedとRubyのワンライナーを使ってるだけなので、それらの環境さえあれば動作します。
なお、ワンライナーをRubyで書いているのは、エスケープ文字の展開をして欲しくなかったためです、gawkだと文字列内のエスケープ文字が展開されてしまうため、正規表現を利用した際に不都合がありました。

PPx設定

差分のみです。
※自身の設定が消えないように、適用前にバックアップを取るか、追加取り込みをしてください
※スクリプトのパスは自身の環境へと合わせて下さい

PPx.CFG
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のワンライナーが読み辛いので、ここだけ別途解説します。

sedワンライナー部分.rb
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


  1. そう言いつつ僕はVimばっか使ってます。