Linuxカーネルコードで%pを%pKに置き換える

Linuxカーネルコードで%pを%pKに置き換える

私は Linux ドライバーを保守しており、ドライバー内のすべての %p を %pK に置き換えたいと思っています。これを行うには、次のコマンドを使用しました。

grep "%p[^K]" -Rl . | xargs sed -i 's/%p[^K]/%pK/g'

以下の場合には失敗します。

%p-%p --> %pK%pK (hyphen is removed)

sed コマンドが機能するための適切な正規表現を提案してください。

答え1

質問の sed 置換では、 が一致した文字列の一部である%pため、ダッシュだけでなく の後の文字も削除されます。これを回避するには、(エスケープされた) 括弧で の[^K]後の文字をキャプチャし%p、 で戻します\1sed

$ 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さん、ありがとうございます。あなたのコメントはとても役に立ちました。:)

関連情報