Scannen und Greppen

Scannen und Greppen

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 grepdie 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 sesund 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 sedstattdessen verwenden

sed -n '/rea ses/s!^.*/\(.*\)\.[^.]*$!\1!p' a4.ses

Ausgabe

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

Was dieser sedBefehl bewirkt, kann wie folgt beschrieben werden

  1. -nnichts drucken, sofern keine Übereinstimmung gefunden wurde
  2. /rea ses/nur Zeilen berücksichtigen, die diesem RE entsprechen
  3. s!...!...!pErsetzen Sie das RE in den ersten beiden Ausrufezeichen ( !) durch die folgende Zeichenfolge, drucken Sie die Zeile jedoch nur aus, wenn eine Übereinstimmung auftritt
  4. Die RE- ^.*/\(.*\)\.[^.]*$Spiele

    • Alles bis zum letzten Schrägstrich/
    • Alles von dort bis zum letzten Punkt .(als Muster gespeichert \1)
    • Alles andere
  5. Die Ersetzung des in #4 beschriebenen Musters erfolgt durch Muster \1, also Ihren Dateinamen ohne die abschließende gepunktete Erweiterung

Antwort4

Sie können basenamezum 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)

verwandte Informationen