0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Paper Plane xUIAdvent Calendar 2016

Day 7

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

Last updated at Posted at 2016-12-06

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

デモ

seddemo.gif

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ばっか使ってます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?