Find and Sed
Categories:
Примеры использования поисковых запросов POSIX c SED FIND GREP
Потоковый редактор SED. В комбинации с UG и FIND. Примеры использования для практического применения.
Замена текста в множестве файлов с множеством вложенных директорий
Вариант с использованием FIND XARGS SED UG
#Заменяем в файлах md
find . -type f -name "*.md" | xargs sed -Ei 's/bx-apps/bx_apps/g'
#Проверяем, что ничего не осталось
ug -r -g'*.md' 'bx-apps' *
А теперь с толкованием по шагам:
find .
- точка говорит что ищем в текущей директории-type f
- говорит что будем искать имена файлов-type d
имена директорий-name "*.md"
- говорит что GLOB паттерн файлов с расширениемmd
|
принимаем на вход поток имен файлов от findxargs
- запустит приложение и передаст ему на вход имя файлаsed -Ei
- запустим потоковый редактор SED с расширенным функционалом POSIX (-E) и править будем прямо в самих файлах (i)'s/bx-apps/bx_apps/g'
- regex строка замены словаbx-apps
наbx_apps
с ключомg
, т.е. глобально.
А теперь проверим, что получилось:
ug -r
- это простоgrep
только удобный и продвинутый,-r
значит от сюда и рекурсивно по всем директориям-g'*.md'
- это glob поиск по файлам с расширением*.md
'bx-apps'
- собственно что должны искать
По результату ничего не должно показать. Кстати, перед началом выполнения find | sed
можно выполнить тоже ug
только с поиском того, что хотим заменить ug -r -g'*.md' 'bx-apps'
Вариант с использованием того же только без UG
#Проверим наличие строк для замены
find . -type f -name "*.md" | xargs sed -En '/bx-apps/p'
#Заменяем в файлах md
find . -type f -name "*.md" | xargs sed -Ei 's/bx-apps/bx_apps/g'
#Проверяем, что ничего не осталось
find . -type f -name "*.md" | xargs sed -En '/bx-apps/p'
Без повторений рассмотрим только изменения:
sed -En
- не будет изменять файл, а только выведет строки в которых встретит искомую строку'/bx-apps/p'
- искомая строка с ключомp
это просто напечатать.
Вариант с использованием того же только без FIND
#Проверяем, что ничего не осталось
ug -r -g'*.md' 'bx-apps' *
#Заменяем в файлах md
ug -r --format='%f' -g'*.md' | xargs sed -Ei 's/bx-apps/bx_apps/g'
#Проверяем, что ничего не осталось
ug -r -g'*.md' 'bx-apps' *
Объяснения:
ug -r -g'*.md' 'bx-apps'
- уже знакомая строка, выведет все файлы и строки с искомой строкойug -r --format='%f' -g'*.md'
- новое значение--format='%f'
- это формат вывода данных, где:%f
- путь и имя файла%n
- номер строки в файле%O
- контекст, с найденным словом%~
- перевод строки
А также, наверно, существует еще 1000 вариантов как это сделать, но я в своих заметках пишу то, чем можно всегда быстро и удобно воспользоваться.