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 -r
Schalter, 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 n
Mal und höchstens m
Mal mit dem vorherigen Atom übereinstimmt. Der Quantifizierer kann beispielsweise ?
als ausgedrückt werden {0,1}
. Weggelassen m
bedeutet, 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, sed
etwa:
$ 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.