在 Linux 核心程式碼中將 %p 替換為 %pK

在 Linux 核心程式碼中將 %p 替換為 %pK

我正在維護一個 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,您的評論很有幫助。 :)

相關內容