使用 sed 从字符串中删除子字符串

Posted

技术标签:

【中文标题】使用 sed 从字符串中删除子字符串【英文标题】:Removing substring out of string using 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 删除子字符串,我做错了什么?谢谢

【问题讨论】:

【参考方案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 $#$twoone,但它抛出了-bash: $#$twoone: 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

【讨论】:

以上是关于使用 sed 从字符串中删除子字符串的主要内容,如果未能解决你的问题,请参考以下文章

sed 从 json 字符串中删除 json 子对象

PB中取字符串子串的函数是啥

PB中取字符串子串的函数是啥

华为OD机试真题Java实现判断字符串子序列真题+解题思路+代码(2022&2023)

[在python中使用正则表达式搜索字符串子字符串

2022华为机试真题 C++ 实现 字符串子序列II