2013-12-05 4 views
0

Я использую следующий код и, похоже, не могу заставить searchterm соответствовать строке с несколькими строками., заменяя строку несколькими строками во многих файлах

!/bin/bash 
# **************** Change Variables Here ************ 
startdirectory="/home/www" 
searchterm="<img src=\"index.gif\"> 
<p>Hello World</p> 
" 
replaceterm="Hi" 
# ********************************************************** 

i=0; 

    for file in $(grep -l -R $searchterm $startdirectory) 
    do 
     cp $file $file.bak 
     sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp 
     mv tempfile.tmp $file 

    let i++; 

     echo "Modified: " $file 
    done 

echo " *** All Done! *** Modified files:" $i 
+2

'sed' в основном работает по одной линии за раз. Возможно поиск нескольких строк, но достаточно сложная работа, которую вы обычно не делаете. Вам нужно перейти на более мощный язык - возможно, Perl или Python. Вероятно, вы могли бы сделать это в 'awk'; это было бы проще, чем 'sed', но сложнее, чем Perl или Python. –

ответ

2

Вот как вы могли бы сделать это с Баш и Perl:

shopt -s globstar nullglob 
cd $searchdirectory 
perl -0777 -i.bak -pe "s/$searchterm/$replaceterm/g" ** 

-0777 вариант для Perl читает файлы целиком, а не построчно-лайн. Тогда совпадение шаблонов может работать сразу над всем файлом. Я предполагаю, что ваши файлы не огромны. Я также предполагаю, что у вас нет имен файлов с пробелами или символами новой строки.

Заметка, что будет касаться каждые файла. После этого вы можете развернуть каталог, чтобы удалить file.bak, который не изменяется от file.

Смежные вопросы