如何在bash中截断字符串中的../或..字符 所以,如果我有字符串
str1=../lib
str2=/home/user/../dir1/../dir2/../dir3
然后我怎么能得到一个字符串,而不是任何..字符串,如截断后的结果应该是
str1=lib
str2=/home/user/dir1/dir2/dir3
请注意,我对字符串的绝对路径并不感兴趣。
答案 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