2017-06-21 4 views
1

In meinem Bash-Skript habe ich eine Variable, die einen Pfad enthält. Lassen Sie sagen:Suchen und Ersetzen Ordnername im Pfad

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

Ich möchte in der Lage sein und den Namen des übergeordneten Ordners von c/d durch etwas anderes (sagen wir mal newB) ersetzen, um zu erhalten:

/a/newB/c/d/e 

Wie kann ich TU das? Ich habe mein Bestes versucht, cut, sed und awk zu kombinieren, aber ich bekomme furchtbar lange Befehle, ohne das gewünschte Ergebnis zu erhalten.

Antwort

1

Mit sed:

sed -E 's#^(.*/)[^/]+(/c/d/)#\1newB\2#' 
  • (.*/) Matches bis zu den / (und setzen in gefangen Gruppe 1), gefolgt von einem oder mor e Zeichen, die nicht / ([^/]+)

  • Die zweite erfassten Gruppe sind, (/c/d/) Spieler /c/d/ buchstäblich

  • In dem Ersatz der Elternteil von /c/d/ mit newB und den gefangenen Gruppen ersetzt sind expectedly

  • gehalten

Beispiel:

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

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

Tatsache ist, dass ich das Muster '/ c/d /' kenne, aber nicht seinen Elternnamen. Daher kann ich im sed-Ausdruck nicht "b" angeben. – Simpom

+0

@Simpom Kein Problem ... überprüfen Sie meine Änderungen ... – heemayl

+0

Großartig! Ich akzeptiere diese Antwort, da es ein One-Liner ist und auch mit einer ZSH-Shell funktioniert (nicht in den Anforderungen, sondern ein Plus für mich). – Simpom

1

Verwenden Sie die Parametererweiterung.

#!/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 

Mit extglob können Sie Substitution verwenden, die das Skript vereinfacht:

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

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