我有一个脚本被触发 50 次,同时执行 sed -i 以在单个文本文件中进行编辑。每个脚本都试图编辑同一个文件,我怀疑存在冲突,因为并非所有编辑都在保存。
Sed 正在构建一个临时文件,然后将更改合并到原始文件中。
如何避免这种冲突?
正如戈登评论的那样,您不能同时编辑文件。但是不要害怕;有多种方法可以从多个来源对其进行编辑,或者进行多个独立编辑。
如果你想做的只是多次替换一个模式,sed 有一个内置标志('
g
')。
输入:
Mary had a little lamb and a little cat
编辑:将所有出现的“
a little
”更改为“a big
”
奔跑:
sed 's/a little/a big/g'
您可以从同一个 sed 进行多次编辑。它可以接受无限(ish)数量的
-e
参数,每个参数指定一个独立的表达式,在所有先前的表达式之后运行。
输入:
Mary had a little lamb and a little cat
编辑:将“
lamb
”更改为“tarantula
”,将“cat
”更改为“hamster
”
奔跑:
sed -e 's/lamb/tarantula/' -e 's/cat/hamster/'
对于无法形成一个 sed 表达式来统治它们的情况,您可以在不同的 shell 中运行多个
sed
实例。这是最不推荐的选项,因为:
INOUT="/path/to/my/file"
{
flock --timeout 300 -x $auto_descriptor
sed -i 's/Mary/Jane/' "$INOUT"
} {auto_descriptor}>>"$INOUT"
(auto_descriptor 部分需要 bash 4.1+)