我想要实现的是在文件中找到一个字符串并继续查找第一次出现的另一个匹配并将其替换为某个值。
例如: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
答案 0 :(得分:0)
使用sed
:
,
,每行一部分: sed 's/,/\n/g'
var2:var2
位于同一行,则var2:newvarvalue
替换为Name: name
: 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}
此解决方案通过提取每个并将分隔符设置为换行符来解释对象中的逗号(如第一个对象中所示)。