電話番号の形式をテキストファイルとして指定する必要があります。 (はい)と表示されます。8014516912
-
最初の3つの数字の後に1つを挿入し、-
他の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
拡張正規表現では、数量子は前の原子と少なくとも1回、最大回数を一致させることを{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桁であると仮定します。