在 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,您的评论很有帮助。 :)

相关内容