正規表現でインデントのスペースの個数を置換する


https://stackoverflow.com/a/30304686 より。

4スペースでインデントされているファイルを正規表現で2スペースに置換したい、あるいはその逆の場合は\Gを使えばできる。
\Gは.NET, PCRE (C, PHP, R…), Java, Perl, Rubyでサポートされている。

Rubyを使うなら:

ruby -pe '$_.gsub!(/(^|\G) {4}/, " "*2)' < {ファイル名}

Vim内でやるなら:

%!ruby -pe '$_.gsub\!(/(^|\G) {4}/, " "*2)'

解説

\G
1. 文字列の先頭
2. 前のマッチの直後の位置
のいずれかにマッチする。

他にも例えば

Tarzan A:33 B:32 C:36 Jane A:35 B:33 C:31

という文字列からJaneのスコアをパースして取り出したいというような場合にも使える:

irb(main):002:0> "Tarzan A:33 B:32 C:36 Jane A:35 B:33 C:31".scan(/(?:Jane|\G) \w+:(\d+)/)
=> [["35"], ["33"], ["31"]]

下記ページで解説されている。
http://www.rexegg.com/regex-anchors.html#G