如何从字符串中剪切字符串

时间:2015-01-08 13:10:17

标签: regex string bash unix cut

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

/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。

你能帮助我吗?

6 个答案:

答案 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)

纯粹的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

答案 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”教程。