【发布时间】: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
给定
DIRNAME_MAIN="/home/vMX-ENV/vMX-21.1R1/"
我想只显示上面目录中的21.1R1,有什么办法只能显示home/vMX-ENV/vMX-之后的值吗?并在末尾删除/,这样它最终将不是21.1R1/,而是:21.1R1?
谢谢!
【问题讨论】:
标签: bash awk sed directory script
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-}"
这种情况不需要依赖外部程序。
【讨论】:
使用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 列。
【讨论】: