【问题标题】:Remove part of a string by using bash使用 bash 删除部分字符串
【发布时间】:2019-08-10 03:25:07
【问题描述】:

我有路径 /home/bamboo/bamboo-agent-home/xml-data/build-dir/NG-VOSGQL239-JOB1 并且只想得到 /home/bamboo/bamboo-agent-home/xml-data/build-dir/ 如果路径的最后一部分可以使用 Bash 具有不同的长度,我该如何删除它?

【问题讨论】:

标签: regex linux bash path


【解决方案1】:

一些常见的方法是:

$ str=/home/bamboo/bamboo-agent-home/xml-data/build-dir/NG-VOSGQL239-JOB1
$ echo "${str%/*}"                                # fast, but wrong if str has no "/"s in it
/home/bamboo/bamboo-agent-home/xml-data/build-dir
$ dirname "$str"                                  # slow, but returns "." for bare names
/home/bamboo/bamboo-agent-home/xml-data/build-dir
$ echo "$str" | sed 's@/[^/]*$@@'                 # more general, but slow *and* wrong with no "/"s
/home/bamboo/bamboo-agent-home/xml-data/build-dir

请注意,在上面,我们使用“错误”来表示在路径操作情况下的意外行为。 (例如,我们将dirname 的输出定义为正确的行为。)

【讨论】:

  • 我不推荐使用sed;你只是重新实现dirname,没有任何好处。 (dirnamesed 一样是 POSIX 的一部分。)
  • 同意sed 是这种情况下的错误工具。但是echo | sed ...是字符串操作的常用习语,可以泛化。
【解决方案2】:

使用 bash 正则表达式 =~:

$ var=/home/bamboo/bamboo-agent-home/xml-data/build-dir/NG-VOSGQL239-JOB
$ [[ $var =~ .*/ ]] && echo "${BASH_REMATCH[0]}"
/home/bamboo/bamboo-agent-home/xml-data/build-dir/

【讨论】:

  • if [[ $var =~ (.*)/ ]]; then echo "${BASH_REMATCH[1]}"; else echo .; fi 将是对基本名称行为的更完整模拟。
【解决方案3】:

使用dirname

dirname /home/bamboo/bamboo-agent-home/xml-data/build-dir/NG-VOSGQL239-JOB

【讨论】:

  • 首选dirname 而不是参数扩展"${s%/*}" 的一个原因是,如果文件名中根本没有/s,则dirname 返回.。这有时是一个引人注目的差异,但您会对 fork() 子进程的性能造成很大影响,然后代表该差异加载并执行外部命令。
猜你喜欢
  • 2011-03-07
  • 2013-11-07
  • 1970-01-01
  • 2020-11-03
  • 2017-07-02
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多