2017-06-21 69 views
1

在我的Bash腳本中,我有一個包含路徑的變量。讓說:查找並替換路徑中的文件夾名稱

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

我希望能夠和替換別的東西的c/d父文件夾的名稱(比方說newB),從而得到:

/a/newB/c/d/e 

我怎樣才能去做? 我已經盡了最大的努力去結合cut,sed和awk,但是我得到了非常長的命令而沒有得到想要的結果。

回答

1

隨着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

1

使用參數擴展。

#!/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 
相關問題