用预先指定的值替换字符串的特定部分

Replacing a certain part of string with a pre-specified Value

我对 Puppet 和 Ruby 还很陌生。这个问题很可能之前已经被问过,但我找不到任何相关信息。

在我的人偶代码中,我将从事实主机名中检索一个字符串变量。

$n="$facts['hostname'].ex-ample.com"

我希望得到这样的值

DEV-123456-02B.ex-ample.com, 
SCC-123456-02A.ex-ample.com, 
DEV-123456-03B.ex-ample.com, 
SCC-999999-04A.ex-ample.com 

我想执行以下操作。将字符串更改为小写,然后替换 -02、-03 或 -04 到 -01。

所以我的输出会像

dev-123456-01b.ex-ample.com, 
scc-123456-01a.ex-ample.com, 
dev-123456-01b.ex-ample.com, 
scc-999999-01a.ex-ample.com

我认为我需要在 $n 上使用 .downcase 来使所有内容都变成小写。但我不确定如何替换数字。我在考虑 .gsub 或拆分,但不确定如何。我更愿意在一行代码中实现这一点。

如果你真的想要一个单行,你可以 运行 针对每个字符串:

str
  .downcase
  .split('-')
  .map
  .with_index { |substr, i| i == 2 ? substr.gsub(/0[0-9]/, '01') : substr }
  .join('-')

在不知道您的输入列表采用何种格式的情况下,我不确定如何就如何迭代它提出建议,但也许您已经涵盖了这一点。希望对你有帮助。

如果 -01--04 部分始终位于同一字符串索引上,您可以使用它来替换内容。

original = 'DEV-123456-02B.ex-ample.com'
#                  11 -^

string = original.downcase # creates a new downcased string
string[11, 2] = '01' # replace from index 11, 2 characters
string #=> "dev-123456-01b.ex-ample.com"

请注意,Puppet 和 Ruby 是完全不同的语言,其他答案适用于 Ruby,不适用于 Puppet。

您需要的是:

$h = downcase(regsubst($facts['hostname'], '..(.)$', '01'))
$n = "${h}.ex-ample.com"
notice($n)

注:

  • downcase 和 regsubst 函数来自 stdlib。
  • 我使用 regsubst 函数进行正则表达式搜索和替换,并替换 ..(.)$ - 2 个字符后跟我在字符串末尾捕获的另一个字符,并将其替换为 01 和捕获的字符串。
  • 所有这些都被小写了。