在匹配后在行上插入一个字符串,忽略带有#的行

时间:2017-08-24 12:23:46

标签: bash awk sed printf

这可能是一个困难的问题。

我需要一种通过bash脚本为Apache2配置文件添加别名的方法。

我已经征服了检查别名是否已经在另一个配置文件中使用grep。我现在面临的问题是如何添加' ServerAlias testing.com'到配置文件。

每个配置文件都有两个用于端口80和端口443的虚拟主机。

我需要添加字符串' ServerAlias testing.com'在' ServerName'之后的下一行的每个配置但忽略以#或;。开头的任何行。

示例:

<VirtualHost *:80>

    # A comment with ServerName in it <-- must be ignored

    ServerName test.com
    <<ADD STRING HERE>> 

</VirtualHost>
<VirtualHost *:443>

    ServerName test.com
    <<AND HERE>>

</VirtualHost>

任何帮助都将不胜感激。

编辑: 注释必须被忽略,因为apache上的默认配置包含我希望保留的注释,而这些注释中的注释是&#39; ServerName&#39;必须忽略的,只有一个&#39; ServerName&#39;每个虚拟主机。

虚拟主机标记对我来说无关紧要,只要我可以忽略这些注释并在每个虚拟主机配置中ServerAlias testing.com之后的行上添加ServerName

这需要对配置进行编辑,然后保存文件

4 个答案:

答案 0 :(得分:0)

尝试关注并告诉我这是否对您有所帮助。

awk '/<\/VirtualHost>/{a=""} /VirtualHost/{a=1} a && $1~/ServerName/ && $2 ~ /test.com/{print $0 RS "    ServerAlias " s1 "testing.com" s1;next} 1 ' s1="'"  Input_file

EDIT1:由于OP想要忽略评论并将其保存到Input_file本身,请尝试关注。

awk '/^#/{next} /<\/VirtualHost>/{a=""} /VirtualHost/{a=1} a && $1~/ServerName/ && $2 ~ /test.com/{print $0 RS "    ServerAlias " s1 "testing.com" s1;next} 1 ' s1="'"  Input_file > temp && mv temp Input_file

答案 1 :(得分:0)

sed '/<VirtualHost \*:\(80\|443\)>/{
    :a;
    n;
    /<\/VirtualHost>/!{
        /^\(\s*#.*\|\s*\)$/ba;
        s/\(\s*\)ServerName test.com/&\n\1ServerAlias testing.com/;
        ba; 
    };
}' <input_file_path

答案 2 :(得分:0)

validate

请注意,它使用前一行中存在的任何缩进来缩进新字符串。

答案 3 :(得分:0)

另一个 awk 方法:

awk '/^ *ServerName test.com/{s=substr($0,1,index($0,"S")-1)"ServerAlias testing.com"; 
     printf "%s\n%s\n", $0,s; next }1' file

输出:

<VirtualHost *:80>

    # A comment with ServerName in it <-- must be ignored

    ServerName test.com
    ServerAlias testing.com

</VirtualHost>
<VirtualHost *:443>

    ServerName test.com
    ServerAlias testing.com

</VirtualHost>

其他 sed 方法:

sed -i 's/^\( *\)\(ServerName test.com\)/\1\2\n\1ServerAlias testing.com/' file