Как заменить текст из совпадения (, но не из каждого совпадения )?

Вы уже на правильном пути. Вы также можете использовать escape-символ \для скобок.

rm -r 10.2\ \(14C92\)

Вы также можете использовать цитирование:

rm -r '10.2 (14C92)'
1
13.02.2021, 19:14
2 ответа

Этого можно добиться с помощью следующего однострочника Perl:

perl -0777 -pe 's{(<Directory\s/var/www/.*?AllowOverride\s)None(.*?</Directory>)}{$1All$2}gs' /tmp/file

Здесь флаг -0777изменяет разделитель строк на undef, поэтому perl будет читать файл как одну строку (это может быть проблемой для больших файлов ).

-pдля перебора строк файла и их печати, -eдля запуска скрипта, /tmp/fileваш файл конфигурации

s{(<Directory\s/var/www/.*?AllowOverride\s)None(.*?</Directory>)}{$1All$2}gs— это регулярное выражение, сопоставляющее 2 части строфы каталога с /var/www и в основном заменяющее «Нет» на «Все». Обратите внимание, что в Perl вы можете использовать почти любой символ в качестве разделителя регулярных выражений, в этом случае я использовал {}вместо //.

2
18.03.2021, 22:30

Одним из способов с sedявляется:

sed -E '/<Directory \/var\/www\/>/,/<\/Directory>/{
       s/AllowOverride None/AllowOverride All/; }' infile

это обновляет / изменяетAllowOverride Noneна AllowOverride All, только если это между<Directory /var/www/>и</Directory>(мы экранировали косую черту обратной косой чертой -, это потому, что косая черта является специальным символом для команды sed ).

2
18.03.2021, 22:30

Теги

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