Команда grep для замены многострочного текста из файла httpd.conf в Fedora - PullRequest
0 голосов
/ 17 апреля 2009

Я новичок в сценариях оболочки и в среде Linux.

В моем проекте я пытаюсь найти следующий текст из файла httpd.conf

<Directory '/somedir/someinnerdir'>
AllowOverride All
</Directory>

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

Итак, часть моего сценария, с которой я пытаюсь достичь этого, выглядит примерно так:

grep -ve "<Directory '/somedir/someinnerdir'>\\nAllowOverride All\\n</Directory>" /etc/httpd/conf/httpd.conf > tmp_direct

echo -e "<Directory '/somedir/someinnerdir'>\\nAllowOverride All\\n</Directory>" >> tmp_direct

mv tmp_direct /etc/httpd/conf/httpd.conf

В настоящее время у меня нет кода передо мной, поэтому могут быть некоторые синтаксические ошибки выше, но логика / кодировка те же.

Вышеупомянутый фрагмент кода не может выполнить то, чего я хочу достичь, поскольку команда grep не поддерживает многострочный поиск.

Моя ОС - Fedora 8.

Можете ли вы предложить что-то в этом коде, чтобы достичь того, что нужно, или может быть какой-то другой альтернативой.

Любая помощь в этом отношении будет высоко оценена.

Заранее спасибо.


Спасибо за ваши ответы.

Извините за предыдущий неверный код. Это исправлено.

Чарли и я-стон, из-за ограничений работоспособности я не смогу реализовать sed или perl, так как его нужно будет добавить в среду, в которую мы будем распространять этот проект.

Стив, я хочу проверить несколько строк. Я не помещал это в блоки кода, таким образом это удалило теги каталога. (

Так что мне нужно будет найти какой-то другой выход.

Еще раз спасибо.

С уважением.

Ответы [ 3 ]

1 голос
/ 17 апреля 2009

Звучит как работа для sed(1). То, что вы хотите, будет очень близко к

sed -i.bak -e '/AllowOverride All/i# '  file

, чтобы закомментировать строку (помните, что httpd.conf имеет комментарии), за которой следует

sed -i.bak -e 's/# AllowOverride All/AllowOverride All '  file

чтобы вернуть его обратно.

ПРЕДУПРЕЖДЕНИЕ Я не пробовал, вы хотите прочитать справочную страницу и самостоятельно проверить ее.

0 голосов
/ 17 апреля 2009

Я не уверен, что понимаю вопрос. Поправьте меня, если я ошибаюсь, но вы пытаетесь добавить «AllowOverride All» в httpd.conf при первом запуске вашего скрипта. Если да, то хотите ли вы включить его?

Тогда на втором проходе вы можете включить / отключить команду?

Если я правильно помню, «AllowOverride» разрешен только в разделе , поэтому имеет смысл добавлять / включать только в определение:

Если приведенное выше верно, вы можете сделать это в perl ..

1-й запуск: добавить

perl -0777 -pi -e's {(. ? (?! AllowOverride \ s + All). ?)} [\ nAllowOverride Все \ n $ 1] ixgs 'httpd.conf

Это добавит «AllowOverride All» в раздел Справочника, только если он еще не содержит его.

2-й запуск: изменить

На втором прогоне вы можете закомментировать , как предложил Чарли .. или, если вам нравится perl

perl -0777 -pi -e's {(. ?) (AllowOverride \ s + All) (. ?)} [$ 1 # $ 2 $ 3] ixgs 'httpd.conf

и комментарий в

perl -0777 -pi -e-х {(. ?) (# AllowOverride \ S + All) (. ?)} [$ 1AllowOverride \ s + Все $ 3] ixgs' httpd.conf

Регулярное выражение s {} [] довольно многословно, и есть более подходящие регулярные выражения, чтобы сделать то же самое, но это легче (надеюсь) для начинающего понять:).

Объяснение опций команды perl

-0777 заставляет Perl читать весь файл за один раз, потому что 0777 не является допустимым значением символа

-p помещает цикл вокруг вашего скрипта

-i позволяет редактировать файлы на месте (поэтому ваша команда в '-e' меняет файл)

-e позволяет указать одну строку кода в командной строке

В этой единственной строке у нас есть регулярное выражение. см. perldoc perlre для получения информации об этом.

Надеюсь, это поможет

0 голосов
/ 17 апреля 2009

Если вы хотите убедиться, что вы соответствуете всей строке, вы можете сделать: grep -v "^ AllowOverride All $"

^ соответствует началу строки, а $ соответствует концу строки.

Это помогает? Я не совсем понимаю, что вы пытаетесь сделать с grep.

...