如何在bash中截断字符串中的../字符?

时间:2014-09-16 05:49:16

标签: bash

如何在bash中截断字符串中的../或..字符 所以,如果我有字符串

str1=../lib
str2=/home/user/../dir1/../dir2/../dir3

然后我怎么能得到一个字符串,而不是任何..字符串,如截断后的结果应该是

str1=lib
str2=/home/user/dir1/dir2/dir3

请注意,我对字符串的绝对路径并不感兴趣。

3 个答案:

答案 0 :(得分:3)

您实际上不需要分叉子shell来调用sed。使用bash parameter expansion

echo ${var//..\/}

str1=../lib
str2=/home/user/../dir1/../dir2/../dir3

echo ${str1//..\/}     # Outputs lib
echo ${str2//..\/}     # Outputs /home/user/dir1/dir2/dir3

答案 1 :(得分:1)

您可以使用:

pax> str3=$(echo $str2 | sed 's?\.\./??g') ; echo $str3
/home/user/dir1/dir2/dir3

请注意(正如您所看到的那样)与您开始时的路径

如果您不经常这样做,请求外部流程执行此操作很好。如果您希望每秒使用多次次,例如在紧密循环中,内部bash命令会更快:

pax> str3=${str2//..\/} ; echo $str3
/home/user/dir1/dir2/dir3

这使用了手册页中描述的bash模式替换(稍微修改以适应手头的问题):

  

<强> ${parameter/pattern/string}

     

parameter已展开,pattern与其值的最长匹配将替换为string。如果模式以/开头,模式的所有匹配将替换为字符串。

     

如果string为null,则删除模式匹配,并且可以省略/之后的pattern

答案 2 :(得分:0)

您可以使用sed来实现它

sed 's/\.\.\///g'

例如

echo $str2 | sed 's/\.\.\///g'

OP => /home/user/dir1/dir2/dir3