属性 带有 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组,所以从false
到true
后的内容不会被截断。
新的第二组 \(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
所以这意味着 -
在匹配正则表达式时可以存在也可以不存在。
我有一个测试 属性 文件,里面有这个:
-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组,所以从false
到true
后的内容不会被截断。
新的第二组 \(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
所以这意味着 -
在匹配正则表达式时可以存在也可以不存在。