【问题标题】:Remove last two path components of a path in a shell variable删除 shell 变量中路径的最后两个路径组件
【发布时间】:2015-10-06 22:51:06
【问题描述】:

我有一个变量var=/usr/local/bin/test/exec

现在我必须删除上述变量中​​的最后 2 个路径组件:

var=/usr/local/bin/

删除最后 2 个字符串后,我必须在 shell 循环中使用这个变量 'var'。

我试过了:

  var='/usr/local/bin/test/exec'
  echo ${var#$(dirname "$(dirname "$s")")/}
  

输出:

test/exec

我将截断部分作为输出,但我期待的是其余部分,而不是截断部分。

【问题讨论】:

  • var1="$(echo $var | sed 's/.\{9\}$//')"

标签: shell variables replace


【解决方案1】:

您可能对 shell 的内部子字符串处理运算符感兴趣:%%%###。观察:

#!/bin/sh

var=/usr/local/bin/test/exec

# use shell substring processing to cut the variable down to size:

var="${var%/*}"
var="${var%/*}"

echo "$var" 

# Manipulate the resulting string in a loop
for i in 1 2 3
do echo "${var}${i}"
done

【讨论】:

  • 我认为他想要你砍掉的部分,但如果你在原始版本中添加另一个 var,然后剪切其余部分,它应该可以工作:var2=/usr/local/bin/test/exec; var=$(sed "s#${var}##" <<< $var2)
【解决方案2】:

经过一番谷歌搜索后,我找到了解决方案:

var1="$(echo $var | cut -d '/' -f-4)"

【讨论】:

  • var1="$(echo $var | sed 's/.\{9\}$//')"
【解决方案3】:

如果您不知道字段数,有一个标准的awk 解决方案。不过,我将使用rev 展示另一个技巧

var='/usr/local/bin/test/exec'; echo $var | rev | cut -d/ -f3- | rev

会给

/usr/local/bin

【讨论】:

    【解决方案4】:

    你也可以试试这个方法

    var=/usr/local/bin/test/exec
    
    sed 's_\(.*\)/.*/.*$_\1_' <<< $var
    

    另一种方法

    sed 's_\(.*\)\(/.*\)\{2\}$_\1_' <<< $var
    

    输出:

    /usr/local/bin
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2019-12-01
      • 2012-07-23
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多