【问题标题】:How to remove | substract directory name from bash?如何删除 |从bash中减去目录名称?
【发布时间】:2022-01-19 22:59:26
【问题描述】:

给定

DIRNAME_MAIN="/home/vMX-ENV/vMX-21.1R1/"

我想只显示上面目录中的21.1R1,有什么办法只能显示home/vMX-ENV/vMX-之后的值吗?并在末尾删除/,这样它最终将不是21.1R1/,而是:21.1R1?

谢谢!

【问题讨论】:

    标签: bash awk sed directory script


    【解决方案1】:

    Bash 具有相当广泛的用于操作变量值的内置机制。对当前问题特别感兴趣的是parameter expansion 形式,它删除与指定的shell 模式匹配的前缀或后缀。例如:

    # Remove any trailing slash and store the result in DIRNAME_NORM
    DIRNAME_NORM=${DIRNAME_MAIN%/}
    
    # Emit the value of $DIRNAME_NORM, less the longest prefix matching shell
    # pattern *vMX-
    echo "${DIRNAME_NORM##*vMX-}"
    

    这种情况不需要依赖外部程序。

    【讨论】:

      【解决方案2】:

      使用sed 分组和反向引用

      $ sed 's/[^0-9]*\([^/]*\).*/\1/' input_file
      21.1R1
      

      /[^0-9]* - 排除直到下一个数字字符出现的任何内容。由于这部分不在括号()内进行分组,所以将其排除在外。

      \([^/]*\) - 这将对从第一个数字到下一个 / 斜杠的所有内容进行分组。

      .*/ - 排除其他所有内容

      \1 - 返回具有反向引用 \1 的组。

      awk也可以使用。

      $ awk -F"[/-]" '{print $6}' input_file
      21.1R1
      

      -F"[/-]" - 将分隔符设置为 /- 然后打印包含字符串的第 6 列。

      【讨论】:

      • 您好,感谢您的评论,您可以分解此命令吗?我对 bash 词几乎不熟悉,我正在尝试理解每个命令
      • @nickcrv06 请检查编辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多