Sed
在維護擷取組的同時遞歸地替換為帶 grep 和 sed 的 RegEx?
多麼長的標題。本質上,我擁有的是一組文件,需要用正則表達式遞歸搜尋並替換。
到目前為止,我在沒有擷取組的情況下工作,但是在使用它們時它什麼都不做。我目前正在使用我在另一個問題上找到的命令:
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
為-E
ingrep
並使用[[:digit:]]
or[0-9]+
代替,(\d+)
因為您不使用任何其他 Perl 兼容的東西並且您不需要括號(.*)
從中刪除grep
,這是多餘的- 添加
-E
到sed
或您必須逃脫您的擷取組(...)
和+
- sed 看不懂
\d+
,換成[[:digit:]]
or[0-9]+
$1
用\1
和替換反向$2
引用\2
- 我認為您可以安全地刪除
g
, JD 僅在行首創建一個註釋。grep -Erl '/\* *[[:digit:]]+ *\*/' . | xargs sed -Ei 's/\/\* *([[:digit:]]+) *\*\/ (.*)/\2 \/\/ JD \1/'