рекурсивно заменить с помощью SED

Estoy trabajando en un proyecto que logra precisamente eso. Échale un vistazo:localalias .

Aquí hay una demostración:

enter image description here

3
04.07.2018, 16:03
4 ответа

ваш сеанс 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'

Конечно, это может быть одна -линия, обратите внимание, что символ вертикальной черты(|)может использоваться как продолжение линии.

(*)Я предполагаю, что в имени файла нет пробела, новой строки и других забавных символов.

1
27.01.2020, 21:15

Ваш конвейер не изменяет файлы. Он извлекает строки, соответствующие регулярному выражению, используя 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.

Связанные:

4
27.01.2020, 21:15

Ваш первый 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' {} +
1
27.01.2020, 21:15

Для меня лучше всего с за:

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 для извлеченного файла.

С уважением

1
28.08.2020, 07:59

Теги

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