在 bash 中用不同的 UUID 替换每个出现的给定单词的最简单方法

Joã*_*tos 3 bash uuid

file.txt 多次出现“dummy”一词,目标是用新颖的 UUID 替换每次出现的此类词。

我想知道是否有使用单行命令的解决方案,但如果没有,我想要最简单的 bash 脚本。例如,符合以下条件的内容:

sed -i "s/dummy/$(uuidgen)/g" file.txt
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个命令用相同的 uuid 替换每个单词“dummy”。

例如

输入:

{
{"myid":"dummy"},
{"myid":"ymmud"},
{"myid":"dummy"},
{"myid":"ymmud"},
{"myid":"dummy"},
{"myid":"ymmud"}
}
Run Code Online (Sandbox Code Playgroud)

预期输出:

{
{"myid":"79769E7B-BED5-4CB5-AEF9-CCE445D9212E"},
{"myid":"ymmud"},
{"myid":"F2FDDD4A-4800-4F0F-911A-FEDBC82915DD"},
{"myid":"ymmud"},
{"myid":"52D93565-81E9-479C-8BD9-457754581BBE"},
{"myid":"ymmud"}
}
Run Code Online (Sandbox Code Playgroud)

Bjo*_*hak 5

我想知道是否有使用单行命令的解决方案,但如果没有,我想要最简单的 bash 脚本

这是您的问题的可能解决方案:

假设您的输入文件是例如。

{
  {"myid":"dummy"},
  {"myid":"ymmud"},
  {"myid":"dummy"},
  {"myid":"ymmud"},
  {"myid":"dummy"},
  {"myid":"ymmud"}
}
Run Code Online (Sandbox Code Playgroud)

然后是下面的bash脚本

while IFS= read -r line; do
  echo $line | sed "s/dummy/`uuid`/g";
done < jsonfile
Run Code Online (Sandbox Code Playgroud)

将输出

{
  {"myid":"a1c3874c-601d-11e8-97bd-705ab6b2eca7"},
  {"myid":"ymmud"},
  {"myid":"a1c45e56-601d-11e8-922c-705ab6b2eca7"},
  {"myid":"ymmud"},
  {"myid":"a1c57390-601d-11e8-aa47-705ab6b2eca7"},
  {"myid":"ymmud"}
}
Run Code Online (Sandbox Code Playgroud)

最初您的问题谈到了textfile因此这个特定的解决方案,它忽略了格式。如果你想专门操作 JSON,我推荐例如。jq( apt-get install jq)。

通过新颖的 UUID

UUID 密钥空间(取决于 UUID 类型)非常大。鉴于数据量较少,不太可能导致冲突。