キャプチャグループを維持しながら、grepとsedを使用して正規表現に再帰的に変更しますか?

キャプチャグループを維持しながら、grepとsedを使用して正規表現に再帰的に変更しますか?

タイトルが本当にいいですね。本質的に私が持っているのは、正規表現を使用して繰り返し検索して置き換える必要があるファイルのコレクションです。

これまで私が持っているのは、グループをキャプチャしなくても機能しますが、グループを使用するときは何もしません。現在私が見つけたコマンドを使用しています。別の問題:

grep -rlP "/\* *(\d+) *\*/ (.*)" . | xargs sed -i "s/\/\* *(\d+) *\*\/ (.*)/$2 \/\/ JD $1/g"

この正規表現にはエスケープされたアスタリスクとスラッシュがたくさん含まれており、非常に混乱しています。ただし、デフォルトでは文字列(たとえば)を受け入れます。

/*  73 */   private static int last = -1000;

そしてそれに置き換え

private static int last = -1000; // JD 73

ところで前述したようにまったく動作せず、ファイルも変わりません。

キャプチャグループを使用しない代替正規表現とうまく機能します。

grep -rl "/\* *\*/ " . | xargs sed -i "s/\/\* *\*\/ //g"

しかし、キャプチャグループを導入しようとすると、音なしで失敗します。

ドライブが成功したかのようにしばらく回転する音が聞こえるので、ファイルを検索していることがわかりますが、最終的にファイルは同じままです。

コマンドが機能するように変更することは可能ですか、それともまったく異なる方法で行う必要がありますか?また、理想的には、このソリューションにはbashループは必要ありません。ありがとうございます。

答え1

  • 他のPerl互換エントリを使用せず、括弧は必要ありませんので、in-Pに置き換えてorを代わりに使用してください。-Egrep[[:digit:]][0-9]+(\d+)
  • (.*)それから削除grepしてください。重複しています。
  • -Eキャプチャグループに追加またはsedエスケープする(...)必要があります。+
  • sedが理解していない、\d+または置き換える[[:digit:]][0-9]+
  • 逆参照を$1とに置き換え\1$2\2
  • を安全に取り外せると思いますg。 JD は行の先頭にコメントを作成します。

grep -Erl '/\* *[[:digit:]]+ *\*/' . |
  xargs sed -Ei 's/\/\* *([[:digit:]]+) *\*\/ (.*)/\2 \/\/ JD \1/'

答え2

では、キャプチャさsedれたグループが背の代わりに等として参照されます。より\1\2$1$2Back_002dreferences-and-Subexpressions.html

答え3

sedこの例のようにを使用してください。

echo "/*  73 */   private static int last = -1000;" | 
    sed 's#^/\*[[:blank:]]*\([0-9]*\)[[:blank:]]*\*/[[:blank:]]*\(.*\)$#\2 // JD \1#g'
private static int last = -1000; // JD 73

関連情報