如何从字符串中截取字符串

How to cut a string from a string

例如,我的脚本获取此字符串:

/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file

假设我不知道 /importance 之前的字符串有多长。

我想要一个新变量,它将只保留完整字符串中的 /importance/lib1/lib2/lib3/file

我尝试使用 sed 's/.*importance//' 但它给了我没有 importance 的路径......

这是我的代码中的命令:

find <main_path> -name file | sed 's/.*importance//

我不熟悉正则表达式,所以我需要你的帮助:)

抱歉我的朋友们我的问题有误, 我不需要输出 /importance/lib1/lib2/lib3/file/importance/lib1/lib2/lib3 输出中没有 /file.

你能帮帮我吗?

我会使用 awk:

$ echo "/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file" | awk -F"/importance/" '{print FS}'
importance/lib1/lib2/lib3/file

与以下内容相同:

$ awk -F"/importance/" '{print FS}' <<< "/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file"
importance/lib1/lib2/lib3/file

也就是我们设置字段分隔符为/importance/,这样第一个字段在它之前,第二个在它之后。要打印 /importance/ 本身,我们使用 FS!

全部放在一起,并将其保存到变量中,使用:

var=$(find <main_path> -name file | awk -F"/importance/" '{print FS}')

更新

I don't need the output /importance/lib1/lib2/lib3/file but /importance/lib1/lib2/lib3 with no /file in the output.

然后你可以使用 dirname 之类的东西来获取没有名称本身的路径:

$ dirname $(awk -F"/importance/" '{print FS}' <<< "/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file")
/importance/lib1/lib2/lib3

与其将所有直到重要性替换为空,不如替换为 /importance:

~$ echo $var
/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file
~$ sed 's:.*importance:/importance:' <<< $var
/importance/lib1/lib2/lib3/file

如@lurker 所述,如果 importance 可以在某些 dir 中,您可以添加 / 以确保安全:

~$ sed 's:.*/importance/:/importance/:' <<< "/dir1/dirimportance/importancedir/..../importance/lib1/lib2/lib3/file"
/importance/lib1/lib2/lib3/file

使用 GNU sed:

echo '/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file' | sed -E 's#.*(/importance.*)##'

输出:

/importance/lib1/lib2/lib3/file

纯粹bash

kent$ a="/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file"

kent$ echo ${a/*\/importance/\/importance}   
/importance/lib1/lib2/lib3/file

外部工具:grep

kent$ grep -o '/importance/.*' <<<$a    
/importance/lib1/lib2/lib3/file

I tried to use sed 's/.*importance//' but it's giving me the path without the importance....

你们非常亲密。您所要做的就是替换 importance:

sed 's/.*importance/importance/'

但是,我会使用 Bash 的内置 pattern expansion。它的效率更高,速度更快。

模式扩展 ${foo##pattern} 表示采用 shell 变量 ${foo} 并从 shell 变量的左侧删除最大的匹配 glob 模式:

file_name="/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file"
file_name=${file_name##*importance}

按照您的要求删除末尾的/file

echo '<path>' | sed -r 's#.*(/importance.*)/[^/]*##'
  • 输入/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file
  • Returns: /importance/lib1/lib2/lib3

查看此“Match groups”教程。