кладите результаты для первого удара в пустом файле

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

Почему?

3
задан 20 August 2015 в 15:21

2 ответа

Вы ссылаетесь на тот же файл дважды в конвейере, tee перезапишет файл, прежде чем awk доберется до него. Или используйте временный файл или используйте sponge от moreutils.

Последние версии GNU awk, 4.1.1, имеют -i inplace аргумент , который моделирует оперативный файл редактирования:

4
ответ дан 1 December 2019 в 15:37

То, что Ваш 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>
1
ответ дан 1 December 2019 в 15:37

Другие вопросы по тегам:

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