Поиск и замена строки на нескольких файлах с терминала unix
Мы преобразуем все статические html-страницы в нашу базу кода на php-страницы. Первым шагом было бы изменить все расширение .html файла на .php(что я уже сделал). Второй шаг - обновить все ссылки на каждой из этих html-страниц, чтобы указать на новые страницы php.
(например, внутри index.php у меня есть ссылки на both contact.html и about-us.html. Теперь, когда мы заменили каждое расширение .html файла на .php, нам нужно изменить contact.html для контакта. php и тому подобное, about-us.html - about-us.php).
то, что я хочу сделать сейчас, - это поиск определенной строки для нескольких файлов. (найдите "contact.html" внутри многих файлов, таких как index.php, index2.php, index3.php и т.д. и т.д.), после чего замените все "contact.html" во всех этих файлах на "contact.php".
Я не знаком с командной строкой unix, и я до сих пор видел здесь похожие вопросы на форуме, но не совсем понимаю, какой из них мог бы помочь мне достичь того, чего я хочу. Я использую cygwin, и, если возможно, мне нужно решить это без perl script, так как я его не установил. Мне нужно попробовать использовать sed, grep, find или что-то еще.
Итак, если кто-либо из вас подумает, что это дубликат, пожалуйста, укажите мне соответствующую должность там. спасибо за ваше время.
Ответы
Ответ 1
Попробуйте следующее:
find . -name '*.html' -exec sed -i 's/\.html/\.php/g' "{}" \;
Он найдет все файлы в текущем и подкаталоге, которые заканчиваются на .html
, и запустите sed
для каждого из них, чтобы заменить .html
на .php
где-нибудь в нем.
Подробнее см. http://content.hccfl.edu/pollock/unix/findcmd.htm.
Ответ 2
На моем Mac мне пришлось добавить параметр в параметр -i
: расширение для добавления имени (в этом случае ничего, поэтому файл сохраняется на месте).
find . -name '*.html' -exec sed -i '' 's/\.html/\.php/g' "{}" \;
Ответ 3
You can certainly use ack to select your files to update. For example,
to change all "foo" to "bar" in all PHP files, you can do this from
the Unix shell:
perl -i -p -e's/foo/bar/g' $(ack -f --php)
Источник: man ack
Ответ 4
Это должно работать (найдено здесь: http://www.mehtanirav.com/search-and-replace-recursively-using-sed-and-grep/):
for i in `find . -type f` ; do sed "s/html/php/g" "$i" >> "$i.xx"; mv "$i.xx" "$i"; done
Ответ 5
Это сработало для меня:
find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'
Ответ 6
Ниже script может помочь заменить строку в файлах:
#!/bin/bash
echo -e "please specify the folder where string has need to be replaced: \c"
read a
echo -e "please specify the string to be replaced: \c"
read b
echo -e "please specify the string: \c"
read c
find $a -type f -exec sed -i 's/'"$b"'/'"$c"'/g' {} \; > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "string has been replaced..."
else echo "String replacement has been failed"
exit0
fi