4

在 http.conf 文件中有一个块,例如:

<IfModule mime_module>
    ...
</IfModule>

假设使用 bash,我如何检查以下行

AddHandler application/x-httpd-php .php

已经在前一个块中添加了
,如果没有,我如何将它添加到它的底部导致

<IfModule mime_module>
    ...
    AddHandler application/x-httpd-php .php
</IfModule>

这个块就在文件的中间:
文件内容不以此块开始或结束。


编辑:
为了让这更难,我意识到我也需要进一步检查:很抱歉在我的问题中错过了它。如果上述行已作为注释行存在于上述块中,则为

# AddHandler application/x-httpd-php .php

(char # 可能是该行的第一个字符,或者它之前可能有一些空格,因为它可能在 AddHandler 的 char A 之前有或没有一些空格),我只需要取消注释它,否则我继续添加如所描述的那样。

4

3 回答 3

7
awk '
/mime_module/{
    flag=1
}

flag && /x-httpd-php/{
    has=1
}

flag && /<\/IfModule>/{
    flag = 0
    if(!has)
        print "AddHandler application/x-httpd-php .php"
}
1' input.conf
于 2012-04-10T16:24:34.370 回答
2

这可能对您有用:

sed -i ':a;$!N;/^<IfModule mime_module>.*<\/IfModule>/{s/# *\(AddHandler application\/x-httpd-php \.php\)/\1/;/AddHandler application\/x-httpd-php \.php/!s/.*\n/&\n    AddHandler application\/x-httpd-php .php\n/;p;d};/^<IfModule mime_module>/ba;P;D' input.conf
于 2012-04-10T18:47:12.697 回答
0

以下内容将用您的文本“AddHandler application/x-httpd-php .php”替换块“IfModule - /IfModule”中的任何内容。因此,无论是否找到注释 (#) 或未找到任何内容,该块都将具有正确的信息。

同样重要的是要注意这是一个内联编辑。您要更改的文件将在运行此脚本后立即更改,无需备份。在测试任何东西之前,请备份您的文件。

sed -i '/<\/IfModule>/,/<IfModule>/!s/    \.\.\..*/    \.\.\.\n    AddHandler application\/x-httpd-php .php/g' /yourfile

如果您在 OS X 上工作,您可能想尝试以下脚本

#!/bin/bash

CR="$(printf '\r')"

sed -i '' "/<\/IfModule>/,/<IfModule>/!s/    \.\.\..*/    \.\.\.${CR}    AddHandler application\/x-httpd-php .php/g" /yourfile

起始文件示例:

<IfModule>
    ...
</IfModule>
<NOTHING TO CHANGE>
    ...
</NOTHING TO CHANGE>
<IfModule>
    ...
#   AddHandler application/x-httpd-php .php
</IfModule>
<NO CHANGE>
    ...
    NO CHANGE
</NO CHANGE>

结果:

<IfModule>
    ...
    AddHandler application/x-httpd-php .php
</IfModule>
<NOTHING TO CHANGE>
    ...
</NOTHING TO CHANGE>
<IfModule>
    ...
    AddHandler application/x-httpd-php .php
</IfModule>
<NO CHANGE>
    ...
    NO CHANGE
</NO CHANGE>
于 2012-04-16T22:49:13.177 回答