如何用正则提取分号前指定值及验证sed替换命令有效性
正则调整方案
你当前用的[^=]*;会把末尾的分号纳入匹配结果,两种调整方式可以只拿到value:
- 用正向预查(需要正则引擎支持PCRE语法):
[^=]*(?=;)
这个规则只会匹配等号后、分号前的所有字符,分号不会被计入匹配结果。 - 用分组捕获(兼容性更高,所有主流正则引擎都支持):
([^=]*);
你需要的value内容会存在第一个捕获组里,提取的时候直接取分组1的内容即可。
你给出的sed命令无法达到预期效果
原命令sed '/key/ s/[^=]*;/myValue/' fileName的问题在于:
它会匹配到等号之后所有非等号的字符直到分号(也就是示例里的value ;),替换后整行会变成key=myValue export key,不仅把value和分号之间的空格搞没了,还直接删掉了分号,不符合预期。
如果要实现替换value为myValue的需求,可以用sed的分组捕获功能,正确的命令如下:
sed '/key/ s/=\([^;]*\);/=myValue;/' fileName
如果你的value和分号之间像示例一样有空格,可以调整正则适配空格:
sed '/key/ s/=\([^; ]*\)[[:space:]]*;/=myValue ;/' fileName
执行后就可以得到key=myValue ; export key的预期结果。
内容的提问来源于stack exchange,提问作者FreshTransistor
相关产品推荐
相关产品推荐

