Rubyでテキストを置換してみる。

非常に基本なのだけど、改めて便利であります。

行末に「\」を追加するスクリプト
$ ruby -pe ‘$_.sub!(/$/,”\\”)’ [ファイル名] > [新しいファイル]

【pオプション】 スクリプトの先頭にwhile gets、スクリプトの最後にprint $_とendを追加
【eオプション】 Rubyスクリプトを文字列で指定
【$_】 getsメソッドで1行読み込んだ文字列を参照する変数
【String#sub!】 第一引数の正規表現にマッチした部分を第二引数の文字列で破壊的に置換
【/$/】 行末にマッチ
【\\】 特殊文字のエスケープ

※引用元のバリケンさんの解説がとても詳しくて良いです。
バリケンのRuby日記
http://rubyist.g.hatena.ne.jp/muscovyduck/


行頭の”123″だけ”SSS”に置換する場合は・・
$ ruby -pe ‘$_.sub!(/^123/,”SSS”)’ [ファイル名] > [新しいファイル]

さらに、String#sub!は1度目のマッチだけ ⇒ String#gsub!はマッチしたものすべて なので・・

例)文字列”123″⇒すべて”abc”に置換
$ ruby -pe ‘$_.gsub!(“123″,”abc”)’ before.txt > after.txt

エスケープされていないものだけを置換したい時・・

例)_を空白に置換、しかし\_は置換したくない。(行頭の場合や、”\\\\_” の場合にも対応。)
a.gsub(/\\?[\\_]/) { case $& when “_” then ” ” else $& end }

(参考)[ruby-list:20587] Re: エスケープされていないものだけを置換
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/20587

最後に、よく使う正規表現。

[0-9] 数字1つ
[A-E] AからEまでのいずれか1文字
+ 直前の表現に1回以上マッチ
* 直前の表現に0回以上マッチ
? 直前の表現に0回あるいは1回マッチ
^suri 先頭がsuri
suri$ 末尾がsuri
() マッチしたテキストをグループ化して記憶。
ab|ce|dz abかceかdz
[aev] aかeかv
[^acd] aでもcでもdでもない1文字
. 改行以外の任意の1文字
\d 数字
\D 数字以外
\s 空白文字 [ \t\n\r\f]
\S 空白文字以外
\w [0-9a-z_A-Z]
\W \w以外

コメントを残す