
Ich habe eine Datei ( *.ses
), die folgende Zeile enthält
$ rea ses '../../../../abcdefgh/abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'
Wenn ich diesen Befehl verwende:
cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}'
die Ausgabe ist:
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'
Ich möchte lediglich Folgendes ausgeben:
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001
ohne die Erweiterung.
Wie kann ich das machen?
Antwort1
Wenn .ses'
es sich um eine statische Erweiterung handelt, codieren Sie das Entfernen dieser nachstehenden 5 Zeichen einfach fest in awk, indem Sie die Zeichenfolge vom Anfang bis 5 Zeichen vor dem Ende drucken:
awk -F/ '{print substr($NF, 1, length($NF)-5)}'
Wenn die Länge der Erweiterung variieren kann, ersetzen Sie sie vor dem Drucken durch die leere Zeichenfolge:
awk -F/ '{gsub(/\..+$/, "", $NF); print $NF}'
Antwort2
Wenn Ihr grep
die Syntax für Perl-kompatible reguläre Ausdrücke (PCRE) unterstützt:
$ grep -Po 'rea ses.*/\K[^.]*' file
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001
Erläuterung:
- matchen
rea ses
und dann gierig alles bis/
einschließlich; dann - Übereinstimmung mit der längsten Folge von Zeichen, die keine Punkte sind
- verwerfen (
\K
) den linken Teil und nur das ausgeben, was vom Match übrig bleibt (-o
)
Antwort3
Sie können auf diese Pipeline verzichten und sed
stattdessen verwenden
sed -n '/rea ses/s!^.*/\(.*\)\.[^.]*$!\1!p' a4.ses
Ausgabe
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001
Was dieser sed
Befehl bewirkt, kann wie folgt beschrieben werden
-n
nichts drucken, sofern keine Übereinstimmung gefunden wurde/rea ses/
nur Zeilen berücksichtigen, die diesem RE entsprechens!...!...!p
Ersetzen Sie das RE in den ersten beiden Ausrufezeichen (!
) durch die folgende Zeichenfolge, drucken Sie die Zeile jedoch nur aus, wenn eine Übereinstimmung auftrittDie RE-
^.*/\(.*\)\.[^.]*$
Spiele- Alles bis zum letzten Schrägstrich
/
- Alles von dort bis zum letzten Punkt
.
(als Muster gespeichert\1
) - Alles andere
- Alles bis zum letzten Schrägstrich
Die Ersetzung des in #4 beschriebenen Musters erfolgt durch Muster
\1
, also Ihren Dateinamen ohne die abschließende gepunktete Erweiterung
Antwort4
Sie können basename
zum Entfernen einer nachfolgenden Erweiterung Folgendes verwenden:
cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}' | xargs basename -s .ses\'
(aus Gründen der Vollständigkeit eingereicht, angesichts Ihres Prozesses ist die Antwort von @steeldriver besser)