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