Результаты в пустом файле

Я пытаюсь изменить конфигурацию 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>
Другие вопросы по тегам