【问题标题】:sed to remove section of text from a variablesed 从变量中删除文本部分
【发布时间】:2021-08-23 20:31:49
【问题描述】:

所以我认为我已经破解了正则表达式,但无法破解如何让 sed 进行更改。我有一个变量是这样的:

MAKEVAR = EPICS_BASE=$CI_PROJECT_DIR/3.16/base IPAC=$CI_PROJECT_DIR/3.16/support/ipac SNCSEQ=$CI_PROJECT_DIR/3.16/support/seq

(全部为一行)。但我想删除定义 IPAC 的特定部分,所以我的正则表达式如下所示:

(IPAC.+\s)

我知道使用这个工具应该是正确的:

https://www.regextester.com/98103

但是,当我运行不同的迭代尝试 sed 时:

sed 's/(IPAC.+\s)/\&/g' <<< "$MAKEVAR"

然后回显出 MAKEVAR,IPAC 部分仍然存在。

如何更新 shell 变量中的特定文本部分以删除以 IPAC 开头的部分,直到下一个空格?

提前致谢

【问题讨论】:

    标签: shell variables sed


    【解决方案1】:

    没关系,找到解决方法: MAKEVAR=$(sed -E 's/(IPAC.+ipac)//'

    【讨论】:

      【解决方案2】:

      regextester(或任何其他在线工具)是验证正则表达式在该在线工具中是否有效的好方法。不幸的是,这并不意味着它可以在任何给定的命令行工具中工作。特别是您的正则表达式包括\s,它特定于 PCRE 和一些 GNU 工具,并使用 (...) 来描绘捕获组,但仅用于 ERE 和 PCRE,而不是 BRE,例如 sed 默认支持,您必须使用\(...\),而你的替换文本使用'&',它告诉sed你想用文字\&amp;替换匹配正则表达式的字符串,而实际上你只是想删除它。

      这就是我认为您正在尝试使用任何 sed 做的事情:

      $ sed 's/IPAC[^ ]* //' <<< "$MAKEVAR"
      EPICS_BASE=$CI_PROJECT_DIR/3.16/base SNCSEQ=$CI_PROJECT_DIR/3.16/support/seq
      

      【讨论】:

        【解决方案3】:

        使用更短的

        MAKEVAR=$(sed 's/IPAC.*ipac//' <<< "$MAKEVAR")
        

        IPAC.*ipac 一直匹配从第一个 IPAC 到最后一个 ipac。匹配的文本将从文本中删除。

        【讨论】:

          猜你喜欢
          • 2023-03-21
          • 2016-06-19
          • 2013-04-09
          • 2021-01-18
          • 1970-01-01
          • 1970-01-01
          • 2013-01-09
          • 2011-01-18
          • 1970-01-01
          相关资源
          最近更新 更多