我的文件包含
$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
'贪婪的' 表示匹配最长的可能字符串。
'懒惰的' 表示匹配尽可能短的字符串。