使用Sed正则表达式的属性文件 - 忽略匹配的第一个字符

时间:2016-08-12 19:10:21

标签: regex sed properties-file

我有一个测试属性文件:

-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

1 个答案:

答案 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个字符。

请告诉我这是否适合您或您是否需要其他解决方案。