Вы также можете использовать команду «найти», чтобы найти файлы и выполнить действие для каждого файла индивидуально.
find <directory_name> -name '??t*' -exec mv {} <target_directory> \;
Замена sed в вопросе удалит все символы после % p
, а не только тире, поскольку [^ K]
является частью совпадающей строки. Вы можете обойти это, захватив символ после % p
с (экранированными) круглыми скобками и вернув его с помощью \ 1
. В sed
:
$ echo '%p %p %pK' | sed 's/%p\([^K]\)/%pK\1/g'
%pK %pK %pK
Хотя вы можете захотеть использовать [^ a-zA-Z]
или аналогичный на тот случай, если вы должны были использовать другие модификаторы для % p
.
Следующая команда сделала для меня волшебство
for fname in $(grep "%p[^K]" -Rl .); do perl -pi -e 's/%p(?!K)/%pK/g' $fname; done
Спасибо Sundeep, ваш комментарий очень помог :)