@Stigunya

Bash: Замена совпадений между определенными строками?

Подскажите пожалуйста, как можно сделать замену текста, который находится между строкой, в которой содержится AAA и строкой, в которой содержится BBB.

Пример текста:
<Directory /var/www/123.ru>
        Options -Includes +ExecCGI
        FCGIWrapper /var/www/php-bin/test/php .php
        FCGIWrapper /var/www/php-bin/test/php .phtml
</Directory>


Задача: Заменить между
<Directory /var/www/123.ru> и </Directory>
все совпадения FCGIWrapper /var/www/php-bin/test/php на FCGIWrapper /var/www/php-bin/test/php5

Не знаю даже что использовать. Буду очень благодарен за регулярку.
  • Вопрос задан
  • 2601 просмотр
Пригласить эксперта
Ответы на вопрос 2
#!/bin/bash

FILE="$1"
PATTERN="$2"
PATH1=$3
PATH2=$4

LINES=$(grep -n -A4 "${PATTERN}" ${FILE} | grep FCGI | cut -d "-" -f1)

for line in ${LINES}
do
    sed -i "${line}s|${PATH1}|${PATH2}|" ${FILE}
done

cat ${FILE}


1. Получаешь номера строк которые нужно заменить. Для этого используешь grep с параметром -A4 который означает выводить последующие 4 строчки относительно совпадения. У этих строчек благодаря параметру -n выведутся номера, cut оставит только их.
2. Для каждого найденного номера строки делается замена

Скрипт вызывать так соответственно так:
./toster.sh test '<Directory /var/www/123.ru>' 'FCGIWrapper /var/www/php-bin/test/php' 'FCGIWrapper /var/www/php-bin/test/php5'


скрипт <файл> <начало блока> <что заменить> <на что заменить>

Перед прогонкой советую сохранить оригинальный файл, к примеру добавить в цикл перед sed
cp ${FILE} ${FILE}.bk
Ответ написан
3vi1_0n3
@3vi1_0n3
На самом деле можно еще проще:
sed -i file -re "/Directory/,/\/Directory/ {s/(test\/php)/\15/}"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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