我正在維護一個 Linux 驅動程序,我想用 %pK 替換驅動程式中的所有 %p。為此,我使用了以下命令。
grep "%p[^K]" -Rl . | xargs sed -i 's/%p[^K]/%pK/g'
在下面的情況下會失敗。
%p-%p --> %pK%pK (hyphen is removed)
請建議正確的正規表示式以使 sed 指令正常運作。
答案1
問題中的 sed 替換將刪除 a 之後的所有字符%p
,而不僅僅是破折號,因為 a[^K]
是匹配字串的一部分。您可以透過%p
使用(轉義的)括號捕獲後面的字符,然後使用 放回它來解決這個問題\1
。在sed
:
$ echo '%p %p %pK' | sed 's/%p\([^K]\)/%pK\1/g'
%pK %pK %pK
儘管您可能想要使用[^a-zA-Z]
或 類似的,以防萬一您要使用其他修飾符%p
。
答案2
以下命令對我來說很神奇
for fname in $(grep "%p[^K]" -Rl .); do perl -pi -e 's/%p(?!K)/%pK/g' $fname; done
謝謝 Sundeep,您的評論很有幫助。 :)