regex - 如何使用 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
和一些变化,但它没有工作。
解决方案
使用您显示的示例,请尝试以下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 将避免走得更远,并提及打印其余没有的行里面的匹配值。awk
match
awk
,ph:[0-9]+(\.[0-9]+)?
val
:
:
1
第二种解决方案:使用sub
.awk
awk -v newVal="0.5" '/^allNames=/{sub(/,ph:[^,]*/,",ph:"newVal)} 1' Input_file
推荐阅读
- sql - 显示同一数据库中两个表的列中的数据差异
- java - 使用 selenium 将元素滚动到屏幕中间
- c# - C# WPF System.Windows.Controls.TreeView 如何更改选定节点
- swift - GTM (Google Tag Manager) 6.0 和 Firebase Analytics 5.0 版本冲突
- python - 搜索功能问题
- ios - 无法在 itune 中删除 IAP 产品
- maven - maven 如何决定何时使用目标文件夹作为类路径
- wordpress - wp_editor 不在表格单元格中?
- php - Detect if empty, has only spaces, or is null
- javascript - 基于JWT-token登录后如何将用户重定向到另一个页面?