Find and Sed

Примеры использования поисковых запросов POSIX c SED FIND GREP

Замена текста в множестве файлов с множеством вложенных директорий

Вариант с использованием 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' *

А теперь с толкованием по шагам:

  1. find . - точка говорит что ищем в текущей директории
  2. -type f - говорит что будем искать имена файлов -type d имена директорий
  3. -name "*.md" - говорит что GLOB паттерн файлов с расширением md
  4. | принимаем на вход поток имен файлов от find
  5. xargs - запустит приложение и передаст ему на вход имя файла
  6. sed -Ei - запустим потоковый редактор SED с расширенным функционалом POSIX (-E) и править будем прямо в самих файлах (i)
  7. 's/bx-apps/bx_apps/g' - regex строка замены слова bx-apps на bx_apps с ключом g, т.е. глобально.

А теперь проверим, что получилось:

  1. ug -r - это просто grep только удобный и продвинутый, -r значит от сюда и рекурсивно по всем директориям
  2. -g'*.md' - это glob поиск по файлам с расширением *.md
  3. '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'

Без повторений рассмотрим только изменения:

  1. sed -En - не будет изменять файл, а только выведет строки в которых встретит искомую строку
  2. '/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' *

Объяснения:

  1. ug -r -g'*.md' 'bx-apps' - уже знакомая строка, выведет все файлы и строки с искомой строкой
  2. ug -r --format='%f' -g'*.md' - новое значение --format='%f' - это формат вывода данных, где:
    • %f - путь и имя файла
    • %n - номер строки в файле
    • %O - контекст, с найденным словом
    • %~ - перевод строки