我有一个测试属性文件:
-config.test=false
config.test=false
我尝试使用sed更新这些属性的值,无论他们前面是否有-
。最初我使用的是这个,有效:
sed -i -e "s/#*\(config.test\)\s*=\s*\(.*\)/\1=$(echo "true" | sed -e 's/[\/&]/\\&/g')/" $FILE_NAME
然而,由于我基本上忽略了比赛前的所有角色,我发现当我的键具有以相同值结束的属性时,它会给我带来问题。如:
# The regex matches both of these
config.test=true
not.config.test=true
有没有办法可以忽略匹配的第一个字符,或者忽略最初的-
?
编辑:
根据我希望正则表达式匹配的内容添加一些说明:
config.test=false # Should match
-config.test=false # Should match
not.config.test=false # Should NOT match
答案 0 :(得分:0)
我找到了一个特定长度的正则表达式的解决方案,而不是用sed和awk忽略第一个字符。有时,相反的方法也是如此。
如果您只有替代使用sed,我有两种解决方法,具体取决于您的文件。
如果您的文件看起来像这样
$ cat file
config.test=false
-config.test=false
not.config.test=false
你可以使用这个单行
sed 's/^\(.\{11,12\}=\)\(.*$\)/\1true/' file
sed正在查看每一行的开头^
,并对\( ... \)
进行分组,以便稍后再引用发生11次或12次.
的每个字符\{11,12\}
,然后是=
。
第一组将替换为后方引用\1
。
将删除在=
到行\(.*$\)
末尾之后匹配每个字符的第二个组。而不是第二组sed替换为您想要的字符串true
。
这也意味着,新字符串true
之后的每个字符都将被切断。
如果你想避免这种情况,你的文件就像
$ cat file
config.test=true # Should match
-config.test=true # Should match
not.config.test=false # Should NOT match
你可以使用这个单行
sed 's/^\(.\{11,12\}=\)\(false\)\(.*$\)/\1true\3/' file
这与之前的示例类似,但可以与三个组一起用于反向引用。
前第2组的内容现在位于第3组。因此,从false
更改为true
后,所有内容都不会被删除。
新的第二组\(false\)
将被删除,并替换为字符串true
。
如果你的文件在之前的例子中看起来像你并且你被允许使用awk,你可以尝试这个
awk -F'=' 'length($1)<=12 {sub(/false/,"true")};{print}'
对我而言,这看起来更加不言自明,但取决于你的决定。
在两个sed示例中,您只调用一次始终良好的sed命令。
第一个sed命令需要39个,第二个50个字符需要输入。 awk命令需要输入52个字符。
请告诉我这是否适合您或您是否需要其他解决方案。