首页 > 解决方案 > 如何使用 sed/perl/awk 查找和替换模式字符串?

问题描述

我有一个文件 foo.properties,其内容如下

foo=bar
# another property
test=true
allNames=alpha:.02,beta:0.25,ph:0.03,delta:1.0,gamma:.5

在我的脚本中,我需要替换任何反对ph的值(bash 脚本未知当前值)并将其更改为 0.5。所以文件应该看起来像

foo=bar
# another property
test=true
allNames=alpha:.02,beta:0.25,ph:0.5,delta:1.0,gamma:.5

我知道如果通过使用已知当前值可以很容易地完成 sed "s/\,ph\:0.03\,/\,ph\:0.5\,/" foo.properties 但在我的情况下,我必须实际读取内容allNames并搜索该值,然后在 for 循环中替换。其余一切都已处理,但我无法弄清楚sed/perl命令。我尝试使用sed "s/\,ph\:.*\,/\,ph\:0.5\,/" foo.properties和一些变化,但它没有工作。

标签: regexperlawksed

解决方案


使用您显示的示例,请尝试以下awk代码。

awk -v new_val="0.5" '
match($0,/,ph:[0-9]+(\.[0-9]+)?/){
  val=substr($0,RSTART+1,RLENGTH-1)
  sub(/:.*/,":",val)
  print substr($0,1,RSTART) val new_val substr($0,RSTART+RLENGTH)
  next
}
1
'  Input_file

详细说明:创建awk名为的变量使用函数匹配new_val主程序中,如果找到匹配的正则表达式,则将匹配的值存储到变量中。然后用这里替换 val 变量中从值到结束的。然后打印值作为 OP 的先决条件(与 val 匹配的正则表达式值之前的值(正则表达式中的编辑匹配值)与新值和行的其余部分),使用 next 将避免走得更远,并提及打印其余没有的行里面的匹配值。awkmatchawk,ph:[0-9]+(\.[0-9]+)?val::1



第二种解决方案:使用sub.awk

awk -v newVal="0.5" '/^allNames=/{sub(/,ph:[^,]*/,",ph:"newVal)} 1' Input_file

推荐阅读