我的脚本获取此字符串,例如:
/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。
你能帮助我吗?
答案 0 :(得分:1)
我会使用awk
:
$ echo "/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file" | awk -F"/importance/" '{print FS$2}'
importance/lib1/lib2/lib3/file
与以下内容相同:
$ awk -F"/importance/" '{print FS$2}' <<< "/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$2}')
我不需要输出
/importance/lib1/lib2/lib3/file
但是/importance/lib1/lib2/lib3
输出中没有/ file。
然后你可以使用类似dirname
的东西来获取没有名称本身的路径:
$ dirname $(awk -F"/importance/" '{print FS$2}' <<< "/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file")
/importance/lib1/lib2/lib3
答案 1 :(得分:1)
替换为/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
答案 2 :(得分:1)
使用GNU sed:
echo '/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file' | sed -E 's#.*(/importance.*)#\1#'
输出:
/importance/lib1/lib2/lib3/file
答案 3 :(得分:1)
kent$ a="/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file"
kent$ echo ${a/*\/importance/\/importance}
/importance/lib1/lib2/lib3/file
kent$ grep -o '/importance/.*' <<<$a
/importance/lib1/lib2/lib3/file
答案 4 :(得分:0)
我尝试使用
sed 's/.*importance//'
,但它给了我没有importance
的路径....
你非常接近。您所要做的就是替换importance
:
sed 's/.*importance/importance/'
但是,我会使用内置pattern expansion的Bash。它效率更高,速度更快。
模式扩展${foo##pattern}
表示采用shell变量${foo}
并从shell变量的左侧删除最大的匹配glob模式:
file_name="/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file"
file_name=${file_name##*importance}
答案 5 :(得分:0)
在您询问时删除最后的/file
:
echo '<path>' | sed -r 's#.*(/importance.*)/[^/]*#\1#'
/dir1/dir2/dir3.../importance/lib1/lib2/lib3/file
/importance/lib1/lib2/lib3
请参阅此“Match groups”教程。