正規表現の謎を調査しています。私は疲れているので、明らかな何かが欠けているかもしれませんが、その理由はわかりません。
以下の例では、perlを使用していますが、これはVIMで最初に見たので、複数の正規表現エンジンに関連していると思います。
このファイルがあると仮定します。
$ cat data
1 =2 3 =4
5 =6 7 =8
次に、「=」の前の空白を削除できます。
$ cat data | perl -ne 's,(.)\s+=(.),\1=\2,g; print;'
1=2 3=4
5=6 7=8
すべての行で、一致のすべてのインスタンスが置き換えられていることに注意してください。/ g検索修飾子を使用しました。これは最初の置換で停止せず、代わりに行の終わりまで置換を続けます。
たとえば、「=2」の前のスペースと「=4」の前のスペースの両方が削除されました。同じ行に。
's、=、=、g'のような単純な構造を使用してみませんか?さて、私たちはもっと難しいシナリオの準備をしていました...割り当ての右側が引用符で囲まれた文字列であり、一重引用符または二重引用符のいずれかである可能性があります。
$ cat data2
1 ="2" 3 ='4 ='
5 ='6' 7 ="8"
同じ作業(等号の前の空白を削除)を行うには、文字列に等号が含まれている可能性があるため、注意する必要があります。したがって、最初に表示される引用符にマークを付け、後方参照を介してそれを探します。
$ cat data2 | perl -ne 's,(.)\s+=(.)([^\2]*)\2,\1=\2\3\2,g; print;'
1="2" 3='4 ='
5='6' 7="8"
後方参照\2を使用して、最初に見たものと同じ引用符ではないものを何度でも検索しました([^ \ 2] *)。次に、元の見積もり自体(\ 2)を検索しました。見つかった場合は、逆参照を使用して、置換ターゲット内の一致したパーツを参照しました。
今これを見てください:
$ cat data3
posAndWidth ="40:5 =" height ="1"
posAndWidth ="-1:8 ='" textAlignment ="Right"
ここで必要なのは、すべての行で「=」のすべてのインスタンスの前に存在する最後のスペース文字を削除することです。以前と同様に、文字列自体に等号が含まれている可能性があるため、単純な's、= "、="、g'を使用することはできません。
したがって、上記と同じパターンに従い、後方参照を使用します。
$ cat data3 | perl -ne "s,(\w+)(\s*) =(['\"])([^\3]*)\3,\1\2=\3\4\3,g; print;"
posAndWidth="40:5 =" height ="1"
posAndWidth="-1:8 ='" textAlignment ="Right"
それは機能します...しかし、ラインの最初の試合でのみ!'textAlignment'に続くスペースは削除されず、その上にあるスペース('height'のもの)も削除されませんでした。
基本的に、/ gは機能しなくなったようです。/gなしで同じreplaceコマンドを実行すると、まったく同じ出力が生成されます。
$ cat data3 | perl -ne "s,(\w+)(\s*) =(['\"])([^\3]*)\3,\1\2=\3\4\3,; print;"
posAndWidth="40:5 =" height ="1"
posAndWidth="-1:8 ='" textAlignment ="Right"
この正規表現では、/gは無視されているようです。なぜ何かアイデアはありますか?