Wie drucke ich die ersten beiden Felder in einer Datei?

Wie drucke ich die ersten beiden Felder in einer Datei?

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.
  • BOLDa dies über das Caret-Symbol verknüpft ist ^, kann offensichtlich nur eine Übereinstimmung erfolgen.
  • Das Matching wird an die printFunktion weitergegeben.
  • -lneOptionen dienen zum Ausführen Perldes in der Option angegebenen Codes -ein jeder Zeile der Eingabedatei. -nBewirkt, 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, sedalles 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 -Eund stattdessen einem erweiterten regulären Ausdruck,

sed -E 's/([[:digit:]]+).*/\1/' filename

verwandte Informationen