Sed 编辑就地竞争条件

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

我有一个脚本被触发 50 次,同时执行 sed -i 以在单个文本文件中进行编辑。每个脚本都试图编辑同一个文件,我怀疑存在冲突,因为并非所有编辑都在保存。

Sed 正在构建一个临时文件,然后将更改合并到原始文件中。

如何避免这种冲突?

bash sed edit
1个回答
0
投票

正如戈登评论的那样,您不能同时编辑文件。但是不要害怕;有多种方法可以从多个来源对其进行编辑,或者进行多个独立编辑。

使用 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
实例。这是最不推荐的选项,因为:

  • 它仍然会按顺序进行编辑,因为一次只能安全运行一个 sed
  • 操作的顺序是不确定的,所以如果两个表达式重叠,它会得到未定义的结果(例如,将“little”替换为“big”,并将“big”替换为“huge”)。
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+)

© www.soinside.com 2019 - 2024. All rights reserved.