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

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

テキストファイル内の電話番号をフォーマットする必要があります。次のように表示されます (例)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 桁であると想定しています。

関連情報