sed命令的行为有所不同

时间:2019-11-29 12:23:07

标签: ruby sed

我正在尝试使用以下sed命令剥离字符串中的版本号:

sed -E "s/\-[0-9]+\.[0-9]+\.[0-9]+\-?[0-9]*\.?[0-9]*\-?[0-9]*\.?/./g"

因此,这会将字符串“ abc-de-sap-web-1.0.152.war”转换为“ abc-de-sap-web.war”。当作为bash命令运行时,此方法可以找到。但是,我试图通过ruby脚本来运行它。所以我尝试了以下命令:

tar_name = `echo "abc-de-sap-web-1.0.152.war" | sed -E "s/\-[0-9]+\.[0-9]+\.[0-9]+\-?[0-9]*\.?[0-9]*\-?[0-9]*\.?/./g"`

输入“ tar_name”

但是,现在的输出是“ abc-de-sap-web.ar”。它也带有“ w”字符。

任何理由吗?

1 个答案:

答案 0 :(得分:1)

问题在于,双引号字符串文字中的\.?被解释为与任何字符匹配的.

我建议使用Ruby gsub

tar_name = tar_name.gsub(/-(?:[0-9]+\.){2}[0-9.-]*/, '.')

请参见Rubular regex demo

详细信息

  • --连字符
  • (?:[0-9]+\.){2}-两个重复的1+个数字和一个点
  • [0-9.-]*-0个或多个数字,点或连字符

比赛用一个点代替。