Ich habe eine ASCII-Datei mit Dateipfaden, die ich durch Ausführen gelesen habe:
while read p; do echo $p; done < filelist.txt
Die Datei enthält Dateipfade mit folgendem Muster:
./first/example1/path
./second/example1/path
./third/example2/path
Wie kann ich einen bestimmten Teil der Pfadzeichenfolge (von /
bis /
) abrufen, z. B. muss eine Ausgabe abgerufen werden, die Folgendes druckt:
first
second
third
und auch
example1
example1
example2
Ich bin mir sicher, dass es eine Möglichkeit gibt, dies mit regulären Ausdrücken zu tun sed
, aber ich bin damit nicht vertraut.
command-line
bash
text-processing
mcExchange
quelle
quelle
| cut -d/ -f3
in einem Rohr hat den Trick getan. Vielen Dank! Dies ist jetzt der vollständige Befehl:while read p; do echo $p; done < filelist.txt | cut -d/ -f3
cut -d/ -f3 filelist.txt
Sie können dies direkt in Ihrem
read
Befehl tun , indem Sie dieIFS
Variable zquelle
Sie können verwenden
awk
quelle
Wenn Sie ein Element des Pfads möchten, verwenden Sie am besten etwas, das eine Zeichenfolge in Felder aufteilen kann , z. B. awk , cut , python oder perl . Allerdings bash tun kann , auch den Job mit dem Parameter Substitution, Muster Ersatz verwenden und alles in ein Array zu werfen.
Jetzt haben wir eine Reihe von Elementen aus dem Pfad. Wenn der Pfad Leerzeichen enthält, muss möglicherweise das interne Feldtrennzeichen geändert werden
IFS
.quelle
Bash und
cut
sind der richtige Weg, jedoch eine Alternative mit Perl:für das
/
zweitbegrenzte Feld undfür das
/
drittbegrenzte Feld.-l
: Aktiviert die automatische Zeilenendverarbeitung. Es hat zwei separate Effekte. Erstens wird bei Verwendung mit -n oder -p automatisch $ / (das Trennzeichen für Eingabedatensätze) geändert. Zweitens wird $ \ (das Trennzeichen für den Ausgabedatensatz) mit dem Wert octnum zugewiesen, sodass bei Druckanweisungen das Trennzeichen wieder hinzugefügt wird. Wenn octnum weggelassen wird, wird $ \ auf den aktuellen Wert von $ / gesetzt.-a
: Aktiviert den Autosplit-Modus, wenn er mit -n oder -p verwendet wird. Ein impliziter Split-Befehl für das @ F-Array wird als erstes in der impliziten while-Schleife ausgeführt, die von -n oder -p erzeugt wird.-n
: bewirkt, dass Perl die folgende Schleife um Ihr Programm annimmt, wodurch es über Dateinamenargumente wie sed -n oder awk iteriert:-e
: kann verwendet werden, um eine Programmzeile einzugeben;print(@F[N])
: druckt das N-te Feld.quelle