【问题标题】:Removing substring out of string using sed使用 sed 从字符串中删除子字符串
【发布时间】:2012-04-09 07:19:27
【问题描述】:

我正在尝试使用 sed 从变量中删除子字符串,如下所示:

PRINT_THIS="`echo "$fullpath" | sed 's/${rootpath}//' -`"

在哪里

fullpath="/media/some path/dir/helloworld/src"
rootpath=/media/some path/dir

我想像这样回显完整路径的其余部分(我在一大堆目录中使用它,所以我需要将它存储在变量中并自动执行

echo "helloworld/src"

使用变量会是

echo "Directory: $PRINT_THIS"

问题是,我无法通过 sed 删除子字符串,我做错了什么?谢谢

【问题讨论】:

    标签: bash sed substring


    【解决方案1】:

    你不需要sed,单独bash就足够了:

    $ fullpath="/media/some path/dir/helloworld/src"
    $ rootpath="/media/some path/dir"
    $ echo ${fullpath#${rootpath}}
    /helloworld/src
    $ echo ${fullpath#${rootpath}/}
    helloworld/src
    $ rootpath=unrelated
    $ echo ${fullpath#${rootpath}/}
    /media/some path/dir/helloworld/src
    

    查看String manipulation 文档。

    【讨论】:

    • 谢谢,这很有趣,因为我在脚本的其他地方使用了字符串操作,但忘记了
    • 如果你不知道 $rootpath 是否以斜线结尾,你可以这样做:shopt -s extglob; echo "${fullpath##$rootdir*(/)}"
    • 无法在我的示例中使用它,我有 one="branch_name_something"two = "branch_name_"。我只想从 $one 打印“某物”。所以,我尝试了echo ${#${two}one},但它抛出了-bash: ${#${two}one}: bad substitution。不知道我错过了什么。
    • 您使用的语法与我上面使用的完全不同。
    【解决方案2】:

    要在 sed 中使用变量,你必须像这样使用它:

    sed "s@$variable@@g" FILE
    

    两件事:

    • 我使用双引号(shell不要用单引号扩展变量)
    • 我使用了另一个与路径中的斜杠不冲突的分隔符

    例如:

    $ rootpath="/media/some path/dir"
    $ fullpath="/media/some path/dir/helloworld/src"
    $ echo "$fullpath"
    /media/some path/dir/helloworld/src
    $ echo "$fullpath" | sed "s@$rootpath@@"
    /helloworld/src
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 2017-01-31
      • 2020-11-03
      相关资源
      最近更新 更多