与sed匹配后替换第一场比赛

时间:2017-05-23 12:52:56

标签: bash sed

我想要实现的是在文件中找到一个字符串并继续查找第一次出现的另一个匹配并将其替换为某个值。

例如:string = {Name: name;Address:someadd;var1:var1;var2:var2},{Name: differntName;Address:someadd;var1:var1;var2:var2}

现在我需要做的是找到Name:name然后在“Name:name”之后找到第一次出现的“var2:var2”并将其替换为“var2:newvarvalue”

请注意,我需要使用bash脚本中的sed完成此任务。

提前致谢。

编辑:我正在尝试修改.yaml docker compose file

2 个答案:

答案 0 :(得分:0)

使用sed

这是一个糟糕的解决方案
  1. 分为,,每行一部分:
  2. sed 's/,/\n/g'

      如果与var2:var2位于同一行,则
    1. var2:newvarvalue替换为Name: name
    2. sed '/Name: name/s/var2:var2/var2:newvarvalue/'

      sed -E 's/(Name: name.*)var2:var2/\1var2:newvarvalue/'

      这太可怕了,因为任何额外的逗号或换行都可能会破坏整个事情。

答案 1 :(得分:0)

var='{Name: name;Address:somea,dd;var1:var1;var2:var2},{Name: differntName;Address:someadd;var1:var1;var2:var2}'

NEW_VAL='new_value'

IFS=$'\n'

OBJECTS=("$(echo "${var}" | sed -nE 's/[^{]*(\{[^}]+\})/\1\n/gp')")

for obj in "${OBJECTS[@]}"; do
  echo "${obj}" | sed -E 's/(.*var2:)(var2)(.*)/\1'"${NEW_VAL}"'\3/'
done

输出:

{Name: name;Address:somea,dd;var1:var1;var2:new_value}
{Name: differntName;Address:someadd;var1:var1;var2:new_value}

此解决方案通过提取每个并将分隔符设置为换行符来解释对象中的逗号(如第一个对象中所示)