我尝试用这个来改变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
例如,则输出是正确的。
为什么?
答案1
您在管道中两次引用同一个文件,在获取tee
文件之前会覆盖该文件awk
。请使用临时文件或sponge
使用更多工具。
GNU awk 的最新版本 4.1.1 有一个-i inplace
争论模拟就地编辑文件:
答案2
你的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>