【问题标题】:Simplest way to replace each occurrence of a given word by a different UUID in bash在bash中用不同的UUID替换给定单词的每次出现的最简单方法
【发布时间】:2018-05-25 22:02:28
【问题描述】:

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

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

sed -i "s/dummy/$(uuidgen)/g" file.txt

不幸的是,这个命令将每个单词 'dummy' 替换为相同的 uuid。

例如

输入:

{
{"myid":"dummy"},
{"myid":"ymmud"},
{"myid":"dummy"},
{"myid":"ymmud"},
{"myid":"dummy"},
{"myid":"ymmud"}
}

预期输出:

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

【问题讨论】:

  • 请在您的帖子中添加示例输入和预期示例输出,然后告诉我们。
  • @RavinderSingh13 如果这个例子不满意,请告诉我
  • @JoãoMatos:这是您正在处理的 JSON 文本吗?
  • 检查这个答案:stackoverflow.com/a/29329216/745235。根据答案,您可以执行以下操作:sed '/dummy/ { h; s/.*/echo $(uuidgen)/e; x; G; s/dummy\n// }' yourfilename >> newfile

标签: bash uuid


【解决方案1】:

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

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

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

{
  {"myid":"dummy"},
  {"myid":"ymmud"},
  {"myid":"dummy"},
  {"myid":"ymmud"},
  {"myid":"dummy"},
  {"myid":"ymmud"}
}

然后是下面的bash 脚本

while IFS= read -r line; do
  echo $line | sed "s/dummy/`uuid`/g";
done < jsonfile

会输出

{
  {"myid":"a1c3874c-601d-11e8-97bd-705ab6b2eca7"},
  {"myid":"ymmud"},
  {"myid":"a1c45e56-601d-11e8-922c-705ab6b2eca7"},
  {"myid":"ymmud"},
  {"myid":"a1c57390-601d-11e8-aa47-705ab6b2eca7"},
  {"myid":"ymmud"}
}

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

通过一个新颖的 UUID

UUID 密钥空间(取决于 UUID 类型)是巨大的。考虑到少量数据,它不太可能导致collisions

【讨论】:

  • 我收到一个循环重复的“找不到命令”消息,我错过了什么?
  • UUID 设计是为了避免在任何合理的情况下发生冲突。
  • @JoãoMatos 似乎您缺少 uuid 命令。 apt-get install uuid 也许?
  • @chepner 没错,但是如果有足够的(大量)迭代,可能会发生冲突。
  • @chepner 如果质子衰变(可能),宇宙的热寂将以 10^1000 的幅度发生。 UUID 冲突将在大约发生。 10^18 所以你的类比严格来说是不正确的。你的观点的精神当然是正确的。
猜你喜欢
  • 2022-07-05
  • 2018-01-14
  • 2021-11-14
  • 1970-01-01
  • 2017-09-18
  • 2014-09-27
  • 1970-01-01
  • 2015-04-27
  • 2011-03-05
相关资源
最近更新 更多