Следующий сценарий выполняет эту работу:
#!/bin/bash
i=0
grep -rl --exclude=${0:2}. -e pattern | while read -r line
do
sed -i 's/pattern\(.*\)/pattern'$i'/' "$line"
((i++))
done
Цикл while
проходит по всем именам файлов в текущем каталоге (и рекурсивно по подпапкам ), содержащим экземпляр «шаблона». Используя sed
, вы заменяете все, что следует за «шаблоном» в этой строке, обозначенной группой \(.*\)
, на «шаблон» и значение счетчика i
.
Примечания:
sed -i
замените файлы на месте, если вы просто хотите проверить, все ли правильно заменяет, удалите -i
. --exclude=${0:2}
в вызов grep
,поскольку, если вы ищете в текущем каталоге без него, оно также будет соответствовать имени файла сценария, поскольку оно содержит строки «шаблон» !! Инструмент для поиска файлов называется find
, а не grep
. В названии инструмента есть большая подсказка :-). grep
заключается в G локальном поиске R регулярного E выражения в файле/потоке и P выводе результата -это буквы из команды ed
g/re/p
. Ребята из GNU действительно накосячили, предоставив grep
опции для поиска файлов -, надеюсь, у них нет никаких планов, чтобы в будущем они взяли на себя функции sort, tr, sed, wc и т. д.!
Вот один из способов сделать то, что вы хотите, надежно (делая предположения о том, когда вы хотите увеличить i, что вы подразумеваете под шаблоном, какие символы шаблон может содержать и т. д.):
i=0
while IFS= read -rd '' file; do
grep -q 'pattern' "$file" &&
sed -i 's/pattern*/pattern'"$i"'/g' "$file"
((i++))
done < <(find '/parent/sub/' -type f -print0)