在我的Bash腳本中,我有一個包含路徑的變量。讓說:查找並替換路徑中的文件夾名稱
mypath=/a/b/c/d/e
我希望能夠和替換別的東西的c/d
父文件夾的名稱(比方說newB
),從而得到:
/a/newB/c/d/e
我怎樣才能去做? 我已經盡了最大的努力去結合cut,sed和awk,但是我得到了非常長的命令而沒有得到想要的結果。
在我的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