
Ich habe eine Datei mit Ländernamen und der jeweiligen Mobilfunkvorwahl für das jeweilige Land, wie folgt:
United Kingdom +44 ...more fields
United States Virgin Islands +1 ...more fields
Ich muss den Ländernamen und die Handyvorwahl herausfinden. Der reguläre Ausdruck lautet also: Lies alle Wörter vom Anfang der Zeile an und dann eine Zeichenfolge, die mit einem Pluszeichen und einer weiteren Ziffer beginnt, und dann hör auf.
Ich habe ein paar Dinge mit grep, cut und sogar sed probiert, aber ich bekomme es nicht hin.
Antwort1
Versuche es mit:
grep -o '^[^+]*+[0-9]\+' infile
[^+]*+
passt zu allem, bis das erste +
gefundene Element gefolgt von einer oder mehreren Ziffern[0-9]\+
Antwort2
Befehlszeile:
$ perl -lne 'print /^(.*?\+\d+)/' input.txt
Dadurch erhalten Sie die gewünschten Informationen aus der Eingabe.
Arbeiten:
/^(.*?\+\d+)/
Regex soll alles bis zum ersten Vorkommen eines Pluszeichens gefolgt von mindestens einem Ziffernsymbol extrahieren.BOL
Da dies über das Caret-Symbol verknüpft ist^
, kann offensichtlich nur eine Übereinstimmung erfolgen.- Das Matching wird an die
print
Funktion weitergegeben. -lne
Optionen dienen zum AusführenPerl
des in der Option angegebenen Codes-e
in jeder Zeile der Eingabedatei.-n
Bewirkt, dass Perl nichts druckt, sofern dies nicht ausdrücklich angefordert wird.
Ausgabe:
United Kingdom +44
United States Virgin Islands +1
Antwort3
Seitdu sagst Raumist das in Ihrer Datei verwendete Trennzeichen, sollten Sie verwenden können
cut -d ' ' -f 1-5 filename
um die ersten fünf Spalten aus der Datei zu extrahieren.
Für die gegebenen Daten ergibt sich daraus
United Kingdom +44
United States Virgin Islands +1
... aber ich gehe davon aus, dass dies nur Glückssache ist, da ein Land mit mehr als zwei Wörtern im Namen mehrere Felder umfassen würde (nicht nur zwei).
Eine robustere Methode besteht darin, sed
alles nach der ersten Zifferngruppe in jeder Zeile zu löschen (also alles nach der Ländervorwahl):
sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename
oder,
sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename
oder mit -E
und stattdessen einem erweiterten regulären Ausdruck,
sed -E 's/([[:digit:]]+).*/\1/' filename