如何从字符串中截取字符串
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”教程。
例如,我的脚本获取此字符串:
/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 theimportance
....
你们非常亲密。您所要做的就是替换 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”教程。