通过特殊字符在shell脚本中拆分文件地址

时间:2018-02-27 23:30:21

标签: bash shell

我正在编写一个shell脚本。我有以下格式的文件地址:

/Users/hsn15051/downloads/RandomName1/RandomName2/SN/RandomNumber/Myimage.jpg 

我想使用始终固定的SN参数,以便分割文件地址并具有以下两个字符串

/Users/hsn15051/downloads/RandomName1/RandomName2/SN
/RandomNumber/Myimage.jpg

我该怎么做?

2 个答案:

答案 0 :(得分:1)

$ sed -E 's|(.*/SN)(/.*)|\1\n\2|' <<< /Users/hsn15051/downloads/RandomName1/RandomName2/SN/RandomNumber/Myimage.jpg 

输出:

/Users/hsn15051/downloads/RandomName1/RandomName2/SN
/RandomNumber/Myimage.jpg

如您所见,您可以选择替换分隔符,而非强制使用s///

编辑:

使用与相同的输入尝试此操作:

perl -pe 's|(.*/SN)(/.*)|$1\n$2|'

答案 1 :(得分:1)

如果您使用的是bash,则可以使用bash本身的功能,带子串删除的参数扩展来解析所需的值:

end="${str##*/SN}"   ## get end
begin="${str%$end}"  ## remove end to get begin

这不需要额外的子shell或实用程序。

使用您的值的简短示例:

#!/bin/bash

str="/Users/hsn15051/downloads/RandomName1/RandomName2/SN/RandomNumber/Myimage.jpg" 

end="${str##*/SN}"   ## get end
begin="${str%$end}"  ## remove end to get begin

printf "begin: %s\nend  : %s\n" "$begin" "$end"

示例使用/输出

$ bash splitstr.sh
begin: /Users/hsn15051/downloads/RandomName1/RandomName2/SN
end  : /RandomNumber/Myimage.jpg