Заменить %p на %pK в коде ядра Linux

Заменить %p на %pK в коде ядра Linux

Я поддерживаю драйвер 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 в вопросе удалит все символы после a %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, Ваш комментарий очень помог. :)

Связанный контент