【问题标题】:sed match on one line and change another onesed 匹配一行并更改另一行
【发布时间】:2018-09-28 07:09:22
【问题描述】:

我想浏览一个文件(在本例中是 apache2.conf),搜索标记一个部分开始的行 () 并在该部分中更改另一行(AllowOverride None 到 AllowOverride All)。

我要更改的行可能是也可能不是该部分开头旁边的行,但我只想更改它的第一次出现。

这里是 apache2.conf 的一个例子:

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>             <= this is the begining of the section
        Options Indexes FollowSymLinks
        AllowOverride None        <= this is the line I want to change
        Require all granted
</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>

在朋友的帮助下,我来到了这里:

sed '/"&lt;Directory \/var\/www\/&gt;"/,$ {s/"AllowOverride None"/"AllowOverride All"/ }' apache2.conf

但事实是它不起作用。 我原以为AllowOverride None 在经过 sed 之后会是 AllowOverride All

有什么解决办法吗?我做错了什么?

【问题讨论】:

  • 欢迎来到 Stack Overflow。作为一项规则,与其说“这是它应该做的,但它不起作用”,不如说“这是它应该做的,但它就是这样做的”。

标签: sed


【解决方案1】:

您的sed 命令非常接近。首先,您不应在其中包含任何双引号:

sed '/<Directory \/var\/www\/>/,$ {
        s/AllowOverride None/AllowOverride All/
}' apache2.conf

现在的问题是它还会更改最后一个被注释掉的部分中的AllowOverride None,而您“只想更改它的第一次出现”。

在第一次出现“AllowOverride None”时结束你的块:

sed '/<Directory \/var\/www\/>/,/AllowOverride None/ {
        s/AllowOverride None/AllowOverride All/
}' apache2.conf

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 2013-05-10
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-10-16
    • 2017-05-08
    • 2017-12-19
    相关资源
    最近更新 更多