在添加之前检查行

问题描述 投票:2回答:1

我发现了一些我试过的东西,但没有用。基本上我需要用一行来修改/ etc / export,但是在添加文件之前要先检查以确保该行不存在。它适用于Opsworks,每次停止和启动时,都会运行所有脚本,并在每次启动时将该行附加到此文件。第一个只是列出了没有添加任何东西的文件,第二个就是每次添加它。

awk -v s='/aiw ahost-name02(rw,no_root_squash,sync)' '/^all:/ && $0 !~ s "$" { $0 = $0 OFS s } 1' /etc/export
sed -i.bak '/^\/user @userhosts(rw,no_root_squash,sync,no_subtree_check)$/a /user ahost-name02(rw,no_root_squash,sync)' /etc/export

所以我想附加到现有的行,并检查后续运行,如果出现第二行则不添加。

bash awk sed
1个回答
0
投票

这是一个AWK解决方案。我将正则表达式匹配运算符~ s "$"更改为完全匹配== s

awk -v s="/aiw ahost-name02(rw,no_root_squash,sync)" '$0 == s { fnd = 1 } 1; END { if (!fnd) print s }' /etc/export > export.tmp && mv export.tmp /etc/export

有点麻烦,但它的工作原理。

另一个AWK解决方案:

如果你仍然喜欢在完全匹配~上匹配==的正则表达式,那么你需要从你的变量中正确地准备正则表达式。因为变量s中的括号在匹配期间将被视为正则表达式语法的一部分,而不是字符。

在这里,我通过变量rgx实现这一点:

awk -v s='/aiw ahost-name02(rw,no_root_squash,sync)' '
BEGIN { 
    rgx = s; 
    gsub(/[(]/, "[(]", rgx); 
    gsub(/[)]/, "[)]", rgx); 
} 
$0 ~ rgx { 
    fnd = 1 
} 
1; 
END { 
    if (!fnd) 
        print s 
}' /etc/export > export.tmp && mv export.tmp /etc/export
© www.soinside.com 2019 - 2024. All rights reserved.