【问题标题】:Bash Nested Substring Removal (Extraction)?Bash嵌套子字符串删除(提取)?
【发布时间】:2018-07-03 23:26:06
【问题描述】:

我正在编写的脚本中有类似的内容:

CMD="/path/to/cmd,there.sh"
TMP="${CMD##*/}"
echo "${TMP%%,*}"

有没有办法在第 2 行和第 3 行嵌套删除子字符串,或者在单行中以纯 bash 产生相同的结果,而无需使用另一个程序? ${CMD} 的长度不是静态的。为了清楚起见,我希望输出只是“cmd”。

我尝试了以下各种形式的括号和引号,但出现语法错误。这是(我认为)允许但不在新版本的 Bash 中的东西。

echo "${${CMD##*/}%%,*}"

【问题讨论】:

    标签: string bash substring


    【解决方案1】:

    很遗憾,不,不能在 bash 中组合或嵌套字符串操作。

    【讨论】:

      【解决方案2】:

      使用 bash:

      [[ $CMD =~ .*/([^,]*) ]] && echo ${BASH_REMATCH[1]}
      

      【讨论】:

      • 想知道是否应该使正则表达式 ^.*/([^,]*).*$ 更防错?还是刚刚好?无论如何,我在这里没有看到失败案例。
      • @sjsam:这可能是可能的。
      【解决方案3】:

      Shell 参数替换是原始的,因为它们不提供嵌套等功能。但是,没有人阻止您在这里做sed 的事情。

      cmd="/path/to/cmd,there.sh" # Use lower-case identifiers for user variables
      cmd=$(sed -E 's#^.*/([^,]+),.*$#\1#' <<<"$cmd")
      

      &lt;&lt;&lt; 允许在bash 中使用herestrings

      【讨论】:

        【解决方案4】:

        我发现 zsh 实际上支持嵌套字符串操作,所以我实际上将解释器切换到 zsh 用于我的脚本并且以下工作正常:

        echo "${${CMD##*/}%%,*}"
        

        【讨论】:

          猜你喜欢
          • 2017-11-04
          • 2018-05-04
          • 2021-10-31
          • 2015-04-26
          • 2019-06-22
          • 2023-03-17
          相关资源
          最近更新 更多