保护重复的 sed 替换

保护重复的 sed 替换

这更多的是一个架构问题:

我有一个脚本可以在文件 sed 中进行一些替换/添加,例如:

sed -i 's/MY_VAR = 1000/MY_VAR = 1000\nMY_VAR2 = 500/' file.txt

工作正常,但这是一个相当大的脚本的一部分,有人可能会^C第一次运行并重新运行它,或者只是背靠背地重新运行它 N 次,这将导致类似的结果

MY_VAR = 1000
MY_VAR2 = 500
MY_VAR2 = 500
MY_VAR2 = 500
MY_VAR2 = 500
...

这可能是意想不到的。所以我的问题是:避免这种情况的最佳方法是什么?我想出了类似的东西:

if [ ! -f file.txt~copy ]
then
    cp file.txt file.txt~copy
    sed -i 's/MY_VAR = 1000/MY_VAR = 1000\nMY_VAR2 = 500/' file.txt
fi

哪个应该可以正常工作,但我想知道是否有更好/推荐的方法来实现它?如果您的文件非常大并且您可能只想touch复制文件以进行保护,那么上述内容显然可能会出现问题。

答案1

这不容易扩展,因此可能适合也可能不适合您的实际用例,但您可以检查要添加的行是否已经存在,只有在不存在时才添加:

sed '
  /^MY_VAR = 1000$/ {
    $ b a
    N
    /\nMY_VAR2 = 500$/! s/\n/&MY_VAR2 = 500\
/
    b
    :a a \
MY_VAR2 = 500
  }'

MY_VAR = 1000在这里,当找到确切的行时:

  • 如果是最后 ( $) 行,我们b会定位到a标签并a追加MY_VAR2 = 500到输出的末尾;

  • 如果模式空间在附加Next 行之后,不以 ( !) 后跟的换行符结尾MY_VAR2 = 500,则其嵌入的换行符将替换为换行符 + MY_VAR2 = 500+ 换行符; (然后我们b跑到脚本的末尾以避免也运行追加命令);

  • 否则,我们什么也不做。

相关内容