查找并替换路径中的文件夹名称
问题描述:
在我的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
答
使用参数扩展。
#!/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
事实是我知道'/ c/d /'模式,但不知道它的父名。所以我不能在sed表达式中指定'b'。 – Simpom
@Simpom没问题...检查我的编辑... – heemayl
太棒了!我接受这个答案,因为它是一个班轮,也适用于ZSH外壳(不是在要求中,而是对我来说是一个加号)。 – Simpom