这更多的是一个架构问题:
我有一个脚本可以在文件 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
到输出的末尾;如果模式空间在附加
N
ext 行之后,不以 (!
) 后跟的换行符结尾MY_VAR2 = 500
,则其嵌入的换行符将替换为换行符 +MY_VAR2 = 500
+ 换行符; (然后我们b
跑到脚本的末尾以避免也运行追加命令);否则,我们什么也不做。