Wie verwende ich sed, um eine bestimmte Anzahl von Zahlen zu erkennen, bevor es ein Zeichen einfügt? ###-###-####

Wie verwende ich sed, um eine bestimmte Anzahl von Zahlen zu erkennen, bevor es ein Zeichen einfügt? ###-###-####

Ich muss Telefonnummern in einer Textdatei formatieren. Sie erscheinen als (Beispiel)8014516912

Wie kann ich es formatieren, damit ich -nach den ersten 3 Zahlen ein und dann -nach den weiteren 3 Zahlen ein weiteres einfügen kann, sodass es wie folgt aussieht:801-451-6912

Wie mache ich das für alle Zeilen, die eine Telefonnummer enthalten? Bedenken Sie, dass die Telefonnummern zwischen Text stehen, also nicht immer am gleichen Index. Es kann zum Beispiel so aussehen:

atewfnwieug 8204919561
adw 8915617141

Antwort1

Dazu benötigt man numerische Quantifizierer:

sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file

Der -rSchalter, der erweiterte reguläre Ausdrücke ermöglicht, ist jedoch nicht POSIX, daher wäre eine portablere Lösung

perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file

In erweiterten regulären Ausdrücken {n,m}bedeutet der Quantifizierer, dass er mindestens nMal und höchstens mMal mit dem vorherigen Atom übereinstimmt. Der Quantifizierer kann beispielsweise ?als ausgedrückt werden {0,1}. Weggelassen mbedeutet, dass es keine Obergrenze gibt: +kann als geschrieben werden {1,}. Schließlich {n}bedeutet, dass er genau Mal mit dem vorherigen Atom übereinstimmt n.

Wenn Sie verwenden möchten sed, müssen Sie hierfür nicht unbedingt über erweiterte reguläre Ausdrücke verfügen. Die grundlegende Form regulärer Ausdrücke wäre lediglich weniger lesbar:

sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/\1-\2-\3/' your_file

Antwort2

Ich würde hierfür stattdessen Perl verwenden:

$ perl -pe 's/\b(\d{3})(\d{3})(\d{4})\b/$1-$2-$3/' foo.txt 
atewfnwieug 820-491-9561

adw 891-561-7141 

Sie können es auch direkt vor Ort tun, sedetwa:

$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt 

Wenn Ihre Telefonnummern neben Buchstaben wie diesen stehen können:

abcd1234567890abc
abcd1234567890
1234567890abc

Sie können stattdessen dieses verwenden:

$ perl -pe 's/([^\d]*)(\d{3})(\d{3})(\d{4})([^\d]*)/$1$2-$3-$4$5/' foo.txt 
abcd123-456-7890abc
abcd123-456-7890
123-456-7890abc

Bei allen diesen Auswahlmöglichkeiten wird davon ausgegangen, dass Telefonnummern wie in Ihrem Beispiel immer 10 Ziffern lang sind.

verwandte Informationen