Хорошо, всегда обращайтесь к сценарию awk
Эда по эффективности, но продолжая сценарий sed
+ helper
, используя предварительный вызов grep
, чтобы определить, содержит ли ваш файл слово для замены, вы можете использоватькороткий вспомогательный сценарий, принимающий ${REPLACE_STRING}
, ${STRING}
и filename
в качестве первых трех позиционных параметров следующим образом:
вспомогательный сценарий с именем helper.sh
#!/bin/sh
test -z "$1" && exit
test -z "$2" && exit
test -z "$3" && exit
findw="$1"
replw="$2"
fname="$3"
grep -q "$findw" "$fname" || exit
echo "$(readlink -f $fname) was changed"
grep -n "$findw" "$fname" | {
while read line; do
printf -- " - REPLACE STRING line %d was changed\n" "${line%:*}"
done }
sed -i "s/$findw/$replw/g" "$fname"
Тогда ваш вызов find
может быть, например:
find . -type f -name "f*" -exec ./helper.sh "dog" "cat" '{}' \;
Пример использования / Вывод
Начиная с пары файлов с именем f
содержащий:
$ cat f
my
dog
dog
has
fleas
В файловой структуре, содержащей скрипт в текущем каталоге с подкаталогом d1
и несколькими копиями f
, например
$ tree .
.
├── d1
│ └── f
├── f
└── helper.sh
Запуск результатов скриптав следующем:
$ find . -type f -name "f*" -exec ./helper.sh "dog" "cat" '{}' \;
/tmp/tmp-david/f was changed
- REPLACE STRING line 2 was changed
- REPLACE STRING line 3 was changed
/tmp/tmp-david/d1/f was changed
- REPLACE STRING line 2 was changed
- REPLACE STRING line 3 was changed
и содержание f
соответствующим образом изменяются
$ cat f
my
cat
cat
has
fleas
Если ни в одном из файлов, расположенных в find
, не найден поисковый термин,время модификации этих файлов остается неизменным.
Теперь, учитывая все это, если у вас есть gawk
, следуйте советам Эда, но - вы можете сделать это с sed
и помощником :)