min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

vim キャプチャした文字列の一部を使って置き換えるホールドバッファ機能 :%s/\(¥[1-9]\),/\1/g

 

カンマ区切りのcsvファイルがある。

f:id:min117:20171229032316p:plain

金額の区切りもカンマになってしまっていてawkで扱いにくい。

f:id:min117:20171229032321p:plain

金額の区切りのカンマだけ無くしたい

1行目で言えば ¥8,163¥8163 にしたい

/¥[1-9], とやってキャプチャできるけど、一括置換ではフィールド区切りとしてのカンマまで置き換わってしまう

f:id:min117:20171229032324p:plain

こういうときはホールドバッファという機能を使えばよいらしい。

vim (vi) でマッチした文字列の一部を置換 | Mazn.net

f:id:min117:20171229032233p:plain

置き換えられる部分だけを丸カッコでくくる(ホールドする)したうえでそれを \1 で受けて置き換えに使える。

:%s/\(¥[1-9]\),/\1/g

f:id:min117:20171229032333p:plain

見事に金額の間のカンマだけを消すことができた。

f:id:min117:20171229033153p:plain

同様に

:%s/\(¥[1-9][0-9]\),/\1/g

とやれば、例えば1行目で言えば 21,500 21500 に置き換えすることができる。

vim 最高。

追記)カンマのうしろに数字がくる場合のみ置き換えるよう改良

8,163 → 8163

%s/\(¥[1-9]\),\([0-9]\)/\1\2/g

21,500 → 21500

%s/\(¥[1-9][0-9]\),\([0-9]\)/\1\2/g

590,000 → 590000

%s/\(¥[1-9][0-9][0-9]\),\([0-9]\)/\1\2/g

1279,000 → 1279000

%s/\(¥[1-9][0-9][0-9][0-9]\),\([0-9]\)/\1\2/g