我对以下命令的一部分感到困惑。
awk '/<Directory \/>/,/AllowOverride None/{sub("None", "All", $0)}{print}' /etc/apache2/apache2.conf > myfile.txt
该命令替换
<Directory />
AllowOverride None
</Directory>
和
<Directory />
AllowOverride All
</Directory>
在 Apache 配置中,并将更新的配置写入myfile.txt
.
我不明白该命令如何跨文件的两行进行模式匹配。我无法找到跨界工作的示例。我猜这与 中的逗号有关/<Directory /\>,/AllowOverride
,但我想确切地了解发生了什么。这个模式匹配是如何在文件的两行中完成的?
另外,为什么是{print}
必要的?默认情况下不awk
打印结果吗?
答案1
- 在
/<Directory \/>/,/AllowOverride None/
(这些线之间)内 sub( ... )
将None
替代All
{print}
所有行都需要a (替换或未替换)
请注意, with 行将AllowOverride None
得到 asub
和 a print
,所有其他行将仅打印。
样本文件:
<Directory />
## we don't want None
AllowOverride None
## all or None-thing
</Directory>
会变成
<Directory />
## we don't want All
AllowOverride All
## all or None-thing
</Directory>
关于默认,考虑
... | awk 'NF==7'
默认情况下,它将打印包含 7 个字段的行,但是,在您的情况下,子函数会覆盖默认值,因此不会采取其他操作。这就是为什么您需要显式打印(如果删除显式打印,则不会输出任何内容)。