Поиск и замена вхождений шаблона последовательной переменной

answer=`expr $varnameX % $num1`
1
09.07.2020, 12:57
2 ответа

Следующий сценарий выполняет эту работу:

#!/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,поскольку, если вы ищете в текущем каталоге без него, оно также будет соответствовать имени файла сценария, поскольку оно содержит строки «шаблон» !!
1
18.03.2021, 23:20

Инструмент для поиска файлов называется find, а не grep. В названии инструмента есть большая подсказка :-). grepзаключается в G локальном поиске R регулярного E выражения в файле/потоке и P выводе результата -это буквы из команды edg/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)
1
18.03.2021, 23:20

Теги

Похожие вопросы