文字を挿入する前にsedを使用して特定の数の数を検出するにはどうすればよいですか? ###-###-####

文字を挿入する前にsedを使用して特定の数の数を検出するにはどうすればよいですか? ###-###-####

電話番号の形式をテキストファイルとして指定する必要があります。 (はい)と表示されます。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}意味します。たとえば、数量子は次のように表現できます。省略は上限がないことを意味します。で書くことができます。最後に、平均は前の原子と正確に一致します。nm?{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桁であると仮定します。

関連情報