Результаты в пустом файле
Я пытаюсь изменить конфигурацию 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
например, вывод правильный.
Зачем?
2 ответа
Вы ссылаетесь на один и тот же файл дважды в конвейере, 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>