如果图案不匹配则插入行,否则使用图案修改该行

时间:2016-05-24 08:38:00

标签: shell sed

假设我想使用以下foo.ini修改文件sed

bar="hello"

sed -i "                                                                                                                                                             
# if there is NZ variable in db2dj.ini, we simply set it to the proper value                                                                           
s/NZ=*/NZ=$bar/

# if there is no NZ variable, we add NZ_ODBC_INI_PATH variable and set the proper value to it                                                          
T add


:add
$ i\NZ_ODBC_INI_PATH=$db2dj_nz_odbc_ini_path

" foo.ini

首先假设foo.ini为空。然后我运行上面的sed,我得到了:

NZ=hello

这很好。但是,如果我再次运行相同的sed命令,foo.ini将变为:

NZ=hellohello
NZ=hello

我对sed命令的理想是:

  1. 如果没有NZ变量,则会向其添加NZ=hello

  2. 如果已有NZ变量,其形式为NZ=hi,则会将其更改为NZ=hello

  3. 仅在NZ=hello

  4. 中出现foo.ini

    如何修改上述sed命令才能完成此任务?我相信我的sed命令适用于(1)但不适用于(2)(3)

    非常感谢!

1 个答案:

答案 0 :(得分:2)

简单的grep检查就足够了:

grep -q '\bNZ=\b' foo.ini > /dev/null 2>&1 && sed -i 's/NZ=.*$/NZ=hello/' foo.ini || echo "NZ=hello" >> foo.ini

如果没有变量,则会插入上述语句。如果已经存在不同/相同的值,它也会处理替换。

$ cat foo.ini
cat: foo.ini: No such file or directory
$ grep -q '\bNZ=\b' foo.ini > /dev/null 2>&1 && sed -i 's/NZ=.*$/NZ=hello/' foo.ini || echo "NZ=hello" >> foo.ini
$ cat foo.ini 
NZ=hello
$ grep -q '\bNZ=\b' foo.ini > /dev/null 2>&1 && sed -i 's/NZ=.*$/NZ=hello/' foo.ini || echo "NZ=hello" >> foo.ini
$ cat foo.ini 
NZ=hello
$ vim foo.ini 
$ cat foo.ini 
NZ=hi
$ grep -q '\bNZ=\b' foo.ini > /dev/null 2>&1 && sed -i 's/NZ=.*$/NZ=hello/' foo.ini || echo "NZ=hello" >> foo.ini
$ cat foo.ini 
NZ=hello