sed 替换问题

sed 替换问题

我的文件包含

$Param_T=ABC49_SA_T2
$Param_V=ABC49BC_SA_V2
$Param_ST=ABC491_SA_M2

我正在尝试将以 ABC*_ 开头的值替换为 XYZ12_

sed -i 's/ABC\.*_/XYZ12_/g' INCR.parm

上面是我使用过的 sed 命令。它没有抛出任何错误,但值没有改变。有人可以帮我解决这个问题吗?

答案1

使用 sed,实现非贪婪匹配的方法是指定一组字符想要匹配:

sed -i 's/=ABC[^_]*_/=XYZ12_/g' INCR.parm

即:匹配“ABC”后跟零个或多个非下划线字符,后跟下划线。

请注意,您无法逃脱这个点。 “裸”点表示“匹配任何字符”;转义点的意思是“匹配文字点”。您没有进行任何替换,因为没有数据与文字字符串“ABC”匹配。

答案2

不要转义.匹配所有字符的“” [贪婪的]

sed -i 's/ABC.*_/XYZ12_/g' INCR.parm

输出:

$Param_T=XYZ12_T2
$Param_V=XYZ12_V2
$Param_ST=XYZ12_M2)

如果你只想替换 ABC* 直到第一个下划线 ( _) [懒],你需要使用 perl regex

使用

perl -pe  's/ABC(.*?)_/XYZ12_/g' INCR.parm

输出:

$Param_T=XYZ12_SA_T2
$Param_V=XYZ12_SA_V2
$Param_ST=XYZ12_T2

'贪婪的' 表示匹配最长的可能字符串。

'懒惰的' 表示匹配尽可能短的字符串。

相关内容