【问题标题】:Bash delete all symbols before last 2 "/" symbols in variableBash 删除变量中最后 2 个“/”符号之前的所有符号
【发布时间】:2019-10-04 02:47:50
【问题描述】:

挣扎。请帮忙。

a="/var/www/test/some/page3.html"

我需要把它转换成

a="some/page3.html"

我在努力

a=$(sed "s~/var/www/test/~~g" $a)

但得到 baaaad 结果。

【问题讨论】:

  • 试试a=$(sed 's~/var/www/test/~~g' <<< "$a")
  • 谢谢!我像一盒石头一样笨
  • 使用基于 PE 的修复程序效率更高,就像 Paul 展示的那样,并且避免使用进程替换(以及像 sed 这样的外部工具)。另请参阅 BashFAQ #100wiki.bash-hackers.org/syntax/pe
  • 请注意,heredocs 和 herestrings 会创建临时文件——如果您的 $TMPDIR 位于内存支持的文件系统上,它可能非常高效,但它仍然不是免费的。
  • 使用 awk:a=$(awk -v FS='/' '{print $(NF-1) FS $NF}' <<< "$a")

标签: bash variables sed


【解决方案1】:

Bash parameter parsing.
无需运行子进程。

$: a="/var/www/test/some/page3.html"
$: echo "${a%/*/*}"      # the part you want to get rid of
/var/www/test
$: echo "${a#${a%/*/*}}" # strip that
/some/page3.html

如果你也想去掉那个前导斜线......

$: echo "${a#${a%/*/*}/}"
some/page3.html

【讨论】:

  • 谢谢!非常喜欢
  • 如果它对你有用,你能接受这个解决方案吗?
  • 刚刚做了。我是新来的。我的道歉
  • 没问题。欢迎来到 SO!
  • 谢谢。这很有帮助!当然,这类似于说水是湿的。 :)
【解决方案2】:
a="/var/www/test/some/page3.html"
a=$(basename $(dirname "$a"))/$(basename "$a")
echo "$a"

输出:

一些/page3.html

【讨论】:

    【解决方案3】:

    如果您想打印最后 2 个路径部分,请使用此选项:

    $ a='/var/www/test/some/page3.html'
    $ [[ $a =~ [^/]+/[^/]+$ ]] && a="${BASH_REMATCH[0]}"
    $ echo "$a"
    some/page3.html
    

    如果您想删除前 3 个路径部分,请使用此选项:

    $ a="/var/www/test/some/page3.html"
    $ [[ $a =~ ^(/[^/]+){3}/(.*) ]] && a="${BASH_REMATCH[2]}"
    $ echo "$a"
    some/page3.html
    

    您想要做的Idk,因为这两种方法都会从那个样本输入产生预期的输出。鉴于此,选择您想要完成的操作:

    $ a="/foo/var/www/test/some/page3.html"
    
    $ [[ $a =~ [^/]+/[^/]+$ ]] && echo "${BASH_REMATCH[0]}"
    some/page3.html
    
    $ [[ $a =~ ^(/[^/]+){3}/(.*) ]] && echo "${BASH_REMATCH[2]}"
    test/some/page3.html
    

    【讨论】:

    • 埃德,太美了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2013-01-23
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多