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