テキストファイル内の電話番号をフォーマットする必要があります。次のように表示されます (例)8014516912
-
最初の3つの数字の後に を挿入し、さらに-
次の3つの数字の後に別の を挿入するには、どのようにフォーマットすればよいでしょうか。801-451-6912
電話番号を含むすべての行に対してこれをどのように実行しますか? 電話番号はテキストの間にあるため、番号が常に同じインデックスにあるとは限らないことに注意してください。 たとえば、次のようになります。
atewfnwieug 8204919561
adw 8915617141
答え1
これには数値の量指定子が必要です:
sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file
拡張正規表現を有効にするスイッチ-r
はPOSIXではないので、より移植性の高い解決策は次のようになります。
perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file
拡張正規表現では、量指定子は{n,m}
前のアトムに最小n
回、最大m
回一致することを意味します。たとえば、量指定子は?
と表現できます{0,1}
。省略するとm
上限がないことを意味し、+
と記述できます{1,}
。最後に、{n}
は前のアトムに正確にn
回一致することを意味します。
を使用する場合sed
、拡張正規表現を使用する必要はありません。基本的な正規表現形式は読みにくくなるだけです。
sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/\1-\2-\3/' your_file
答え2
代わりに perl を使用します:
$ perl -pe 's/\b(\d{3})(\d{3})(\d{4})\b/$1-$2-$3/' foo.txt
atewfnwieug 820-491-9561
adw 891-561-7141
次のように、その場で実行することもできますsed
。
$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt
電話番号が次のように文字の隣に表示される場合があります。
abcd1234567890abc
abcd1234567890
1234567890abc
代わりにこれを使用することもできます:
$ 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
これらすべての選択肢は、電話番号が常に例のように 10 桁であると想定しています。