我正在维护一个 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,您的评论很有帮助。 :)