Estoy trabajando en un proyecto que logra precisamente eso. Échale un vistazo:localalias .
Aquí hay una demostración:
ваш сеанс sed работал с выводом grep, а не с реальным файлом.
используйте grep
для списка файлов(*)
grep -e "http://localhost:4000" -r ~/dev_web/_site -l
затем используйте xargs
и sed -i
для редактирования на месте
xargs sed -i -e 's;http://localhost:4000;https://another_site.com;g'
(в примечании вы можете изменить разделитель в sed)
Теперь все вместе
grep -e "http://localhost:4000" -r ~/dev_web/_site -l |
xargs sed -i -e 's;http://localhost:4000;https://another_site.com;g'
Конечно, это может быть одна -линия, обратите внимание, что символ вертикальной черты(|
)может использоваться как продолжение линии.
(*)Я предполагаю, что в имени файла нет пробела, новой строки и других забавных символов.
Ваш конвейер не изменяет файлы. Он извлекает строки, соответствующие регулярному выражению, используя grep
, затем изменяет эти данные, но не пытается внести изменения ни в какие файлы.
Вместо этого, предполагая, что GNUsed
:
find ~/dev_web/_site -type f \
-exec grep -qF 'http://localhost:4000' {} ';' \
-exec sed -i 's#http://localhost:4000#https://another.site#g' {} +
Это найдет все обычные файлы в каталоге ~/dev_web/_site
или в нем. Для каждого такого файла grep
сначала проверяет, содержит ли файл заданную строку. Если это так, то вызывается GNU sed
для замены места -.
Шаг grep
можно было бы опустить, но GNU sed
обновил бы отметку времени модификации для всех файлов без него.
Возможно, вы захотите просмотреть только часть файлов в каталогах ниже ~/dev_web/_site
. Если это так, ограничьте поиск чем-то вроде-name '*.js'
(или любым другим шаблоном имени, который вы хотите сопоставить )сразу после -type f
.
Добавление -print
непосредственно перед -exec sed...
приведет к печати путей к файлам, которые find
передаст sed
.
Связанные:
Ваш первый grep извлекает строки из файлов, а не список файлов.
Чтобы получить список совпадающих файлов, используйте параметр -l
команды grep:
$ grep -rl "htt...." ~/dir
Чтобы выполнить модификацию файлов с помощью sed, передайте список sed (инвертируйте порядок):
$ sed -e 's#http://localhost:4000#https://another_site.com#g' \
$(grep -rle "http://localhost:4000" ~/dev_web/_site)
Это предполагает "чистые" имена файлов. :Без пробелов и новых строк.
Более надежным вариантом является использование find:
fromname='http://localhost:4000
toname='https://another_site.com'
searchdir=~/dev_web/_site
find "$searchdir" -type f \
-exec grep -qF "$fromname" {} ';' \
-exec sed -i 's#'"$fromname"'#'"$toname"'#g' {} +
Для меня лучше всего с за:
for i in $(grep -R "string_to_change" | awk -F: '{print $1}');do sed -i 's/string_to_change/string_changed/g' $i ;done
Объяснение :с помощью grep -R рекурсивно ищет строку, всегда ставя перед именем :имя, чтобы у вас был путь к файлу. И, наконец, сделайте sed для извлеченного файла.
С уважением