Bash 用sed替换匹配后的第一个匹配
我想要实现的是在文件中找到一个字符串,然后继续查找另一个匹配的第一个匹配项,并用一些值替换它 例如:string=Bash 用sed替换匹配后的第一个匹配,bash,sed,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” 请注意,我需要在
{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文件这里是一个使用
sed
的糟糕解决方案:
,
上拆分,每行一部分:sed's/,/\n/g'
Name:Name
位于同一行,则将var2:var2
替换为var2:newvarvalue
:sed'/Name:Name/s/var2:var2/var2:newvarvalue/'
或
sed-E的/(Name:Name.*)var2:var2/\1var2:newvarvalue/'
这很糟糕,因为任何额外的逗号或换行符都可能破坏整个过程
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}
此解决方案通过提取每个对象并将分隔符设置为换行符来解释对象中的逗号(如第一个对象中所示)。
awk
可能比sed
更好,感谢@kind陌生人的快速响应,但我需要在sed中执行此操作,但一旦我没有选择,我可以考虑AWK。这是JSON数据吗?如果是这样,您最好使用jq
或其他专门的解析器。这与试图用正则表达式解析HTML的论点相同;当然,您可以很好地处理基本用例,但是您很快就会遇到一个边缘用例,这将使您从一开始就使用专门的解析器获得巨大的时间收益。编辑:它不是JSON数据。如果存在专门的解析器,那么使用它的意义仍然存在though@vinay如果这是yaml,我建议使用能够解析和修改yaml的编程语言。例如Python,我忘记了步骤3)将行连接在一起,但我想这是显而易见的。