поиск и замена строки в нескольких файлах с терминала Unix - PullRequest
19 голосов
/ 24 сентября 2011

Мы конвертируем все статические html-страницы в нашей кодовой базе в php-страницы.Первым шагом было бы изменить все расширение файла .html на .php (что я уже сделал).Вторым шагом было бы обновить все ссылки на каждой из этих HTML-страниц, чтобы они указывали на новые php-страницы.

(например, внутри index.php у меня есть ссылки как на contact.html, так и about-us.html. Теперь, так как мы заменили каждое расширение файла .html на .php, нам нужно изменить contact.html.to contact.php, а также с about-us.html на about-us.php).

Теперь я хочу найти определенную строку в нескольких файлах.(найдите «contact.html» во многих файлах, таких как index.php, index2.php, index3.php и т. д. и т. д.), после этого замените все «contact.html» во всех этих файлах на «contact.php».".

Я не знаком с командной строкой Unix, и я до сих пор видел подобные вопросы других людей здесь на форуме, но не совсем понимаю, какой из них может помочь мне достичь того, чего я хочу.Я использую Cygwin и, если возможно, мне нужно решить это без Perl-скрипта, так как он не установлен.мне нужно попробовать использовать sed, grep, find или что-то еще.

Так что, если кто-то из вас думает, что это дубликат, укажите мне соответствующий пост там.спасибо за ваше время.

Ответы [ 6 ]

34 голосов
/ 24 сентября 2011

Попробуйте:

find . -name '*.html' -exec sed -i 's/\.html/\.php/g' "{}" \;

Он найдет все файлы в текущем и подкаталогах, оканчивающиеся на .html, и запустит sed на каждом из них, чтобы заменить .html с .php везде, где они появляются.

Подробнее см. http://content.hccfl.edu/pollock/unix/findcmd.htm.

14 голосов
/ 12 июля 2012

На моем Mac мне пришлось добавить параметр к опции -i: расширение, добавляемое к имени (в данном случае ничего, поэтому файл хранится на месте).

find . -name '*.html' -exec sed -i '' 's/\.html/\.php/g' "{}" \;
1 голос
/ 20 ноября 2013
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

0 голосов
/ 22 июня 2016

Ниже скрипт может помочь в замене строки в файлах:

#!/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
0 голосов
/ 24 июня 2014

Это сработало для меня:

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'

0 голосов
/ 24 сентября 2011

Это должно работать (найдено здесь: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...