Sed

在維護擷取組的同時遞歸地替換為帶 grep 和 sed 的 RegEx?

  • April 29, 2020

多麼長的標題。本質上,我擁有的是一組文件,需要用正則表達式遞歸搜尋並替換。

到目前為止,我在沒有擷取組的情況下工作,但是在使用它們時它什麼都不做。我目前正在使用我在另一個問題上找到的命令:

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 循環。謝謝。

  • 替換-P-Eingrep並使用[[:digit:]]or[0-9]+代替,(\d+)因為您不使用任何其他 Perl 兼容的東西並且您不需要括號
  • (.*)從中刪除grep,這是多餘的
  • 添加-Esed或您必須逃脫您的擷取組(...)+
  • sed 看不懂\d+,換成[[:digit:]]or[0-9]+
  • $1\1和替換反向$2引用\2
  • 我認為您可以安全地刪除g, JD 僅在行首創建一個註釋。
grep -Erl '/\* *[[:digit:]]+ *\*/' . |
 xargs sed -Ei 's/\/\* *([[:digit:]]+) *\*\/ (.*)/\2 \/\/ JD \1/'

引用自:https://unix.stackexchange.com/questions/583208