查找并替换路径中的文件夹名称

查找并替换路径中的文件夹名称

问题描述:

在我的Bash脚本中,我有一个包含路径的变量。让说:查找并替换路径中的文件夹名称

mypath=/a/b/c/d/e 

我希望能够和替换别的东西的c/d父文件夹的名称(比方说newB),从而得到:

/a/newB/c/d/e 

我怎样才能去做? 我已经尽了最大的努力去结合cut,sed和awk,但是我得到了非常长的命令而没有得到想要的结果。

随着sed

sed -E 's#^(.*/)[^/]+(/c/d/)#\1newB\2#' 
  • (.*/)比赛高达的/(和投入拍摄组1),然后是一个或多个Ë字符不在/[^/]+

  • 第二捕获基,(/c/d/),火柴/c/d/字面上

  • 在更换的/c/d/父替换newB和所捕获的基团预期地保持

例如:

% mypath=/a/b/c/d/e        

% sed -E 's#^(.*/)[^/]+(/c/d/)#\1newB\2#' <<<"$mypath" 
/a/newB/c/d/e 
+0

事实是我知道'/ c/d /'模式,但不知道它的父名。所以我不能在sed表达式中指定'b'。 – Simpom

+0

@Simpom没问题...检查我的编辑... – heemayl

+0

太棒了!我接受这个答案,因为它是一个班轮,也适用于ZSH外壳(不是在要求中,而是对我来说是一个加号)。 – Simpom

使用参数扩展。

#!/bin/bash 
mypath=/a/b/c/d/e 
parent=${mypath%/c/d/*} 
suffix=${mypath#*/c/d/} 
grandparent=${parent%/*} 

newpath=$grandparent/newB/c/d/$suffix 
echo $newpath 

随着extglob,您可以使用替换,从而简化了脚本:

#!/bin/bash 
mypath=/a/b/c/d/e 

shopt -s extglob 
pattern=+([^/])/c/d 
newpath=${mypath/$pattern/newB/c/d} 
echo $newpath