gpt4 book ai didi

linux - 用命令的输出替换字符串,每次都不同

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:34 26 4
gpt4 key购买 nike

我有很多文件,我想用 UUID 替换类名。我想通了这一点

sed -i -r "s/ Class \w(\w|\d)+/ Class C$(python -c 'import uuid;print(uuid.uuid4().hex)')/"

当模式在每个文件中只出现一次时,它工作正常。但是,如果该模式出现不止一次,则每次出现都将替换为相同的数字。

Class1.vb

Public Class Class1
Public ReadOnly Property P As String = "hello"
End Class

Public Class Class2
Public ReadOnly Property P As String = "hello"
End Class
$ sed -r "s/ Class \w(\w|\d)+/ Class C$(echo $RANDOM)/" Class1.vb
Public Class C27244
Public ReadOnly Property P As String = "hello"
End Class

Public Class C27244
Public ReadOnly Property P As String = "hello"
End Class

我希望这两个类有不同的名称。如何修复我的脚本?

最佳答案

与其说是一个严肃的替代方案,不如说是一个概念证明:GNU sed 解决方案。

sed -E -e '/Class \w+/{h;s/.*/bash -c "echo C\\$RANDOM"/;e' \
-e 'G;s/(.*)\n(.*Class )\w+(.*)/\2\1\3/}' infile

导致

Public Class C24276
Public ReadOnly Property P As String = "hello"
End Class

Public Class C28554
Public ReadOnly Property P As String = "hello"
End Class

这是它的工作原理:

/Class \w+/ {                           # If the line matches "Class <name>"
h # Copy pattern space to hold space
s/.*/bash -c "echo C\\$RANDOM"/ # Write Bash command into pattern space
e # Replace pattern space with command output
G # Append hold space to pattern space
s/(.*)\n(.*Class )\w+(.*)/\2\1\3/ # Swap class name with random number
}

备注:

  • 这使用了 GNU 扩展:特别是 \w 字符类和 e 命令。
  • 使用 -e 将单行版本分成两个命令,因为 the e command后面不能跟任何东西,或者任何东西都被解释为命令。
  • 要运行的命令不能只是 echo C$RANDOM 因为 e 命令使用 sh 而不是 Bash,并且 sh 可能没有 $RANDOM(就像在 Ubuntu 上,sh 是破折号)。
  • 因为命令在双引号中,$RANDOM 中的 $ 必须转义,因为 sed 在 shell 看到命令,必须转义两次。或者,我可以使用

    s/.*/bash -c '\''echo C$RANDOM'\''/

    单引号命令,但这也不是很可读。

关于linux - 用命令的输出替换字符串,每次都不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com