【问题标题】:sed command behaves differentlysed 命令的行为不同
【发布时间】:2019-11-29 20:45:25
【问题描述】:

我正在尝试使用以下 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”字符。

有什么原因吗?

【问题讨论】:

  • 为什么不使用 Ruby .gsubtar_name = tar_name.gsub(/-(?:[0-9]+\.){2}[0-9.-]*/, '.')?但问题是"..." 中的\.? 被解释为.,任何字符。
  • 感谢 Wiktor,gsub 命令实际上对我有用。现在,我将使用它来获得结果。

标签: ruby sed


【解决方案1】:

问题是双引号字符串中的\.? 被解释为匹配任何字符的.

我建议使用 Ruby gsub:

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

请参阅Rubular regex demo

详情

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

匹配项被替换为一个点。

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 2018-12-25
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    相关资源
    最近更新 更多