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 Data
einem 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 grep
folgendermaß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 ZeichenfolgeData
, gefolgt von einer unbekannten Anzahl*
beliebiger Zeichen.
und endet mit dem Datumsformat:4 digits from 0 to 9
Bindestrich2 digits from 0 to 9
Bindestrich2 digits from 0 to 9
.
Hier ist auch eine sed
Lö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-file
oder 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
s
bedeutet 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.