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

如何在bash中截断字符串中的../字符?,bash,Bash,如何截断../或。。bash中字符串中的字符 所以,如果我有字符串 str1=../lib str2=/home/user/../dir1/../dir2/../dir3 那我怎么能在没有任何。。字符串(如截断后的结果)中的字符应为 str1=lib str2=/home/user/dir1/dir2/dir3 请注意,我对字符串的绝对路径不感兴趣。您可以使用: pax> str3=$(echo $str2 | sed 's?\.\./??g') ; echo $str3 /home/

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

str1=../lib
str2=/home/user/../dir1/../dir2/../dir3
那我怎么能在没有任何。。字符串(如截断后的结果)中的字符应为

str1=lib
str2=/home/user/dir1/dir2/dir3
请注意,我对字符串的绝对路径不感兴趣。

您可以使用:

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}

展开
参数
,将
模式
与其值的最长匹配替换为
字符串
。如果模式以
/
开头,则模式的所有匹配项都将替换为字符串

如果字符串为空,则删除模式的匹配项,并且可以省略模式后面的
/

您可以使用:

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}

展开
参数
,将
模式
与其值的最长匹配替换为
字符串
。如果模式以
/
开头,则模式的所有匹配项都将替换为字符串

如果字符串为空,则删除模式的匹配项,并且可以省略模式后面的
/


您可以使用sed来实现它

sed 's/\.\.\///g'
比如说

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

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

您可以使用sed来实现它

sed 's/\.\.\///g'
比如说

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

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

您实际上不需要派生一个子shell来调用
sed
。使用
bash


您实际上不需要派生一个子shell来调用
sed
。使用
bash


如果不想规范化路径,那么
a/../b
应该变成什么?保留段或更改为
a/.b
?或者
a//b
?a/b..c怎么样?你到底想编辑什么?档案?剧本?你的环境?用户输入?你意识到“/home/user/./dir1/./dir2/./dir3”和“/home/user/dir1/dir2/dir3”是两条完全不同的路径,对吗?伊格纳西奥·巴斯克斯·艾布拉姆斯,是的,我意识到了。如果你不想规范化路径,那么
a/../b
应该变成什么?保留段或更改为
a/.b
?或者
a//b
?a/b..c怎么样?你到底想编辑什么?档案?剧本?你的环境?用户输入?您意识到“/home/user/。/dir1/。/dir2/。/dir3”和“/home/user/dir1/dir2/dir3”是两条完全不同的路径,对吗?我意识到了,Ignacio Vazquez Abrams,是的。简单的字符串操作可以使用bash功能来完成,而不需要分叉外部命令,sed用于流的复杂模式匹配和编辑您不需要转义
,因为
/
操作符的参数是shell模式,而不是正则表达式。在模式中,
没有特殊意义。谢谢@chepner。已更新答案以反映您的建议。如果有机会,请提供解释该行为的文档位置?来自操作员的(4.1)手册页文档:“模式替换。模式被扩展以生成模式,就像在路径名扩展中一样”。谢谢@chepner。老实说,我完全不知道这两者是不同的。我读过这句话,但思维模式和正则表达式是一样的。我发现了更多关于贝壳图案和图案的信息。再次感谢!简单的字符串操作可以使用bash特性来完成,而不是分叉外部命令,sed用于复杂的模式匹配和流编辑,您不需要转义
,因为
/
操作符的参数是shell模式,而不是正则表达式。在模式中,
没有特殊意义。谢谢@chepner。已更新答案以反映您的建议。如果有机会,请提供解释该行为的文档位置?来自操作员的(4.1)手册页文档:“模式替换。模式被扩展以生成模式,就像在路径名扩展中一样”。谢谢@chepner。老实说,我完全不知道这两者是不同的。我读过这句话,但思维模式和正则表达式是一样的。我发现了更多关于贝壳图案和图案的信息。再次感谢!您不需要在参数展开中转义
,因为
/
运算符的参数是shell模式,而不是正则表达式。在模式中,
没有特殊意义。您不需要在参数展开中转义
,因为
/
运算符的参数是shell模式,而不是正则表达式。在模式中,
没有特殊意义。