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

Property File with Sed regex - Ignore first character for match

我有一个测试 属性 文件,里面有这个:

-config.test=false
config.test=false

我正在尝试使用 sed 更新这些属性的值,无论它们前面是否有 -。最初我用的是这个,效果很好:

sed -i -e "s/#*\(config.test\)\s*=\s*\(.*\)/=$(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

我找到了一些针对特定长度的正则表达式的解决方案,而不是使用 sed 和 awk 忽略第一个字符。有时相反的人会以更简单的方式做同样的事情。

如果您只能选择使用 sed,我有两种解决方法,具体取决于您的文件。

如果你的文件是这样的

$ cat file
config.test=false
-config.test=false
not.config.test=false

你可以用这个单线

sed 's/^\(.\{11,12\}=\)\(.*$\)/true/' file

sed 正在查看每一行的开头 ^ 并且正在对 \( ... \) 进行分组以便稍后向后引用出现 11 或 12 次 \{11,12\} 的每个字符 .通过 =.

第一组将替换为后向引用 </code>。</p> <p>匹配 <code>= 之后到行尾 \(.*$\) 的每个字符的第二组将被删除。而不是第二组 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\)\(.*$\)/true/' file

这与之前的示例类似,但使用三个组进行反向引用。

原来第2组的内容现在第3组,所以从falsetrue后的内容不会被截断。

新的第二组 \(false\) 将被删除并替换为字符串 true

如果你的文件看起来像前面例子中的那样,并且你可以使用 awk,你可以试试这个

awk -F'=' 'length()<=12 {sub(/false/,"true")};{print}'

对我来说,这看起来更加不言自明,但这取决于您的决定。

在两个 sed 示例中,您只调用了一次 sed 命令,这总是好的。

第一个 sed 命令需要输入 39 个字符,第二个需要输入 50 个字符。 awk 命令需要输入 52 个字符。

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

sed -E 's/^(-?config\.test=).*/true/' file

? 表示 zero or 1 repetitions of 所以这意味着 - 在匹配正则表达式时可以存在也可以不存在。