Abschneiden einer bestimmten Saite aus einer längeren Saite

Abschneiden einer bestimmten Saite aus einer längeren Saite

Ich habe Zeichenfolgen:

fvvDataFolders/DDB/DDB2018-02-21oM]
fbbDataFolders/DDB/DDB2018-02-22oM]

Ich möchte alles entfernen, was mit „Data“ beginnt und mit etwas endet, das wie ein Datum aussieht:

DataFolders/DDB/DDB2018-02-21
DataFolders/DDC/DDB2018-02-22

Wie kann ich es tun?

Antwort1

Entweder

grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d'

oder

perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$/$1/'

reicht aus. Beide drucken die minimale Zeichenfolge, die mit Dataeinem Datum beginnt und endet (JJJJ-MM-TT).

echo "fvvDataFolders/DDB/DDB2018-02-21oM]" > input.txt
echo "fbbDataFolders/DDB/DDB2018-02-22oM]" >> input.txt
grep -P -o 'Data.+?\d\d\d\d-\d\d-\d\d' input.txt

# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22

perl -pe 's/^.+(Data.+?\d\d\d\d-\d\d-\d\d).+$/$1/' input.txt

# output:
DataFolders/DDB/DDB2018-02-21
DataFolders/DDB/DDB2018-02-22

Antwort2

Sie können den Befehl grepfolgendermaßen verwenden:

grep -oP 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}' input-file > output-file
  • -o, --only-matching– zeigt nur den Teil einer Zeile an, der mit MUSTER übereinstimmt.
  • -P, --perl-regexp- PATTERN ist ein regulärer Ausdruck in Perl; in diesem Fall könnte auch die Option -E, --extended-regexp- PATTERN ist ein erweiterter regulärer Ausdruck (ERE) verwendet werden.
  • der reguläre Ausdruck 'Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}'entspricht Ihren Anforderungen. Er beginnt mit der Zeichenfolge Data, gefolgt von einer unbekannten Anzahl *beliebiger Zeichen .und endet mit dem Datumsformat: 4 digits from 0 to 9Bindestrich 2 digits from 0 to 9Bindestrich 2 digits from 0 to 9.

Hier ist auch eine sedLösung:

sed -r 's/^.*(Data.*[0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/' /tmp/input-file 
  • Leiten Sie die Ausgabe in eine neue Datei um > output-fileoder nutzen Sie die Option -i.bak, die Änderungen an ihrer Stelle vorzunehmen und eine Sicherungsdatei zu erstellen.
  • -r, --regexp-extended- erweiterte reguläre Ausdrücke im Skript verwenden.
  • der Befehl sbedeutet Ersetzen: /<string-or-regexp>/<replacement>/.
  • ^.*wird mit dem Zeilenanfang abgeglichen ^, gefolgt von einer unbekannten Anzahl beliebiger Zeichen.
  • .*$wird bis zum Zeilenende abgeglichen $, davor steht eine unbekannte Anzahl beliebiger Zeichen.
  • Innerhalb von wird die Erfassungsgruppe (...)als Variable \1 behandelt. Daher ^.*$wird die gesamte Zeile durch den Teil ersetzt, der mit dem in den Klammern Stehenden übereinstimmt.

verwandte Informationen