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 вариантов как это сделать, но я в своих заметках пишу то, чем можно всегда быстро и удобно воспользоваться.