替换文本中 forloop 的值并连接结果

替换文本中 forloop 的值并连接结果

我有一个算术set Z=2;6;11;165;95;59;131等。我想替换Z以下文本并将结果连接到一个文件中:

HSS-ServiceType=vpbxdZ
HSS-ServiceTrigger=Z0401
    no HSS-SptGroup=1
    no HSS-SptGroup=2
commit -s
    up
HSS-ServiceTrigger=Z0471
    no HSS-SptGroup=1
    no HSS-SptGroup=2
commit -s
    up
no HSS-ServiceProfile=vpbxdZs1
commit -s
no HSS-ServiceTrigger=Z0401
commit -s
no HSS-ServiceTrigger=Z0471
commit -s
up
no HSS-ServiceType=vpbxdZ
commit -s

我试过awk像下面这样

awk 'BEGIN { for(Z=2;6;11;165;95;59;131) print 
/HSS-ServiceType=vpbxdZ
/HSS-ServiceTrigger=Z0401
/   no HSS-SptGroup=1
/   no HSS-SptGroup=2
/commit -s
    up
/HSS-ServiceTrigger=Z0471
/   no HSS-SptGroup=1
/   no HSS-SptGroup=2
/commit -s
/   up
/no HSS-ServiceProfile=vpbxdZs1
/commit -s
/no HSS-ServiceTrigger=Z0401
/commit -s
/no HSS-ServiceTrigger=Z0471
/commit -s
/up
/no HSS-ServiceType=vpbxdZ
/commit -s }' test1.txt

但它因错误而失败

"^ unterminated regexp":

所需的输出将是这样的:

HSS-ServiceType=vpbxd2
    HSS-ServiceTrigger=20401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=20471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd2s1
    commit -s
    no HSS-ServiceTrigger=20401
    commit -s
    no HSS-ServiceTrigger=20471
    commit -s
    up
no HSS-ServiceType=vpbxd2
commit -s

HSS-ServiceType=vpbxd6
    HSS-ServiceTrigger=60401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=60471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd6s1
    commit -s
    no HSS-ServiceTrigger=60401
    commit -s
    no HSS-ServiceTrigger=60471
    commit -s
    up
no HSS-ServiceType=vpbxd6
commit -s

HSS-ServiceType=vpbxd11
    HSS-ServiceTrigger=110401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=110471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd11s1
    commit -s
    no HSS-ServiceTrigger=110401
    commit -s
    no HSS-ServiceTrigger=110471
    commit -s
    up
no HSS-ServiceType=vpbxd11
commit -s

HSS-ServiceType=vpbxd165
    HSS-ServiceTrigger=1650401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=1650471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd165s1
    commit -s
    no HSS-ServiceTrigger=1650401
    commit -s
    no HSS-ServiceTrigger=1650471
    commit -s
    up
no HSS-ServiceType=vpbxd165
commit -s

HSS-ServiceType=vpbxd95
    HSS-ServiceTrigger=950401
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    HSS-ServiceTrigger=950471
        no HSS-SptGroup=1
        no HSS-SptGroup=2
    commit -s
        up
    no HSS-ServiceProfile=vpbxd95s1
    commit -s
    no HSS-ServiceTrigger=950401
    commit -s
    no HSS-ServiceTrigger=950471
    commit -s
    up
no HSS-ServiceType=vpbxd95
commit -s

即原始文件的 7 个副本,其中每个副本都Z根据for我最初尝试中的循环语句替换为不同的值。

答案1

据我猜测,您想更改示例文件中的 Z 值。

for z in 2 6 11 165 95 59 131
do 
   sed -e "s/=Z/=$z/" -e "s/dZ/d$z/" sample.txt
done > result.txt

在哪里

  • sample.txt是你的起始文件
  • -e "s/=Z/=$z/"-e "s/dZ/d$z/"是实际的搜索和替换顺序。

答案2

您可以从 awk 本身内部进行 for 循环。

Z="2;6;11;165;95;59;131" \
awk '
  BEGIN { I = ENVIRON["Z"] }
  { f = f $0 ORS }
  END {
    N = split(I, a, ";")
    for (i=1; i<=N; i++) {
      t = f
      gsub(/dZ/, "d" a[i], t)
      gsub(/=Z/, "=" a[i], t)
      print t
    }
  }
' file.txt

我们将索引存储在环境变量 Z 中。

我们用分号将其拆分 abd 将可迭代索引存储在数组 a 中。

我们将整个文件放入 var f 中。

最后,我们迭代索引并用可迭代替换正则表达式 dZ 和 =Z。打印变量。对其他骰子重复上述操作。

相关内容