Я пытаюсь изменить конфигурацию Apache с этим:
sudo awk '/<Directory \/var\/www\/>/,/AllowOverride None/{sub("None", "All",$0)}{print}' /etc/apache2/apache2.conf | sudo tee /etc/apache2/apache2.conf > /dev/null
После этого /etc/apache2/apache2.conf
пусто. Если я изменяю целевой файл на ~/apache2.conf
например, вывод корректен.
Почему?
Вы ссылаетесь на тот же файл дважды в конвейере, tee
перезапишет файл, прежде чем awk
доберется до него. Или используйте временный файл или используйте sponge
от moreutils.
Последние версии GNU awk, 4.1.1, имеют -i inplace
аргумент , который моделирует оперативный файл редактирования:
То, что Ваш awk
/ tee
приключение не работает надежно, который был уже сказан здесь . ;)
Вы могли попробовать иначе:
барабан
perl
! <глоток> снова барабан глоток>
sudo perl -i.bak -0777pe 's/(<Directory \/var\/www\/>([^<].*\n)*.*AllowOverride\s)None/$1All/' /etc/apache2/apache2.conf
-i.bak
оперативное редактирование и создает резервное копирование /etc/apache2/apache2.conf.bak
-0777
, хлебает целый файл сразу
Входной файл
cat foo
<Directory /var/www/>
foo bar
AllowOverride None
</Directory>
<Directory /var/www1/>
AllowOverride None
</Directory>
команда
perl -i.bak -0777pe 's/(<Directory \/var\/www\/>([^<].*\n)*.*AllowOverride\s)None/$1All/' foo
содержание в файле после запуска команды
cat foo
<Directory /var/www/>
foo bar
AllowOverride All
</Directory>
<Directory /var/www1/>
AllowOverride None
</Directory>