Entfernen Sie den Dateinamen aus einem unordentlichen Pfad in einer Textdatei awk oder sed

Entfernen Sie den Dateinamen aus einem unordentlichen Pfad in einer Textdatei awk oder sed

Ich habe eine XML-Datei mit vielen Zeilen, die ungefähr Folgendes enthalten:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"

Ich möchte die Dateinamen entfernen und alles andere behalten. So:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"

Die Dateinamen und Ordnernamen unterscheiden sich ziemlich stark, aber die Tiefe jeder Datei ist gleich. Löschen Sie also grundsätzlich den Dateinamen nach dem 7. \

Ich habe diesen regulären Ausdruck zusammengehackt und er funktioniert, aber Dateinamen in anderen Teilen der XML werden entfernt:

s/([a-zA-Z0-9_.-]+)\.([a-zA-Z0-9.]{3})$//g

Antwort1

Eine Perl-Methode:

perl -pne 's/^.+\\\K[^"]+//' file
Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"

Demo & Erklärung

Antwort2

So funktioniert es mit GNU sed:

    sed 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file

Die Funktionsweise ist wie folgt:

  • Ich erinnere mich an die Angaben dazwischen oben unter Verwendung von \(und \)(das sind Erfassungsgruppen).
  • Die erste Erfassungsgruppe merkt sich also so viel wie möglich, bis sie auf Folgendes trifft \\.*\..*: einen wörtlichen Backslash (beachten Sie, dass ich ihn maskieren musste, also gibt es zwei), gefolgt von einer beliebigen Anzahl von Zeichen und dann einem wörtlichen Punkt (dies ist Teil des Dateinamens), gefolgt von irgendetwas bis zu einem "(womit wir die zweite Erfassungsgruppe beginnen).
  • Die zweite Erfassungsgruppe merkt sich alles, was auf ein Anführungszeichen folgt, das einem Leerzeichen vorangeht, bis zum Ende der Zeile.
  • Ersetzen Sie es dann durch den gespeicherten Inhalt der ersten Erfassungsgruppe, \1 gefolgt von einem wörtlichen Backslash, gefolgt vom gespeicherten Inhalt der zweiten Erfassungsgruppe und \2.

Sobald Sie bestätigt haben, dass es das gewünschte Ergebnis liefert, fügen Sie einfach Folgendes hinzu, um -idie Ersetzung direkt vorzunehmen:

    sed -i 's/\(.*\)\\.*\..*\(" .*\)/\1\\\2/' your_file

Eingang:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\Drawing965.DWG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\File1.PNG" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\Other.000" Module="0"

Ausgabe:

Save="C:\Users\Administrator\Desktop\my files\1020\A54f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\2706\gFgf0g4f\" Module="0"
Save="C:\Users\Administrator\Desktop\my files\8151\Test\" Module="0"

verwandte Informationen