##########
定期的にさまざまな形式(、など)の電話番号###-###-####
を含むテキストファイルを受け取ります。(###) ###-###
通常10桁ですが、そんなことも見たことがあります+1 (###) ###-####
。
結局のところ、ファイルはデータベースにインポートされましたが、詳細には説明しないため、電話番号は標準形式で指定されました(###) ###-####
。
変更されない唯一のことは、電話番号が常に各行の2番目と3番目のタブ文字の間にあることです。
コマンドラインでこれを行う方法はありますか?
答え1
文書が説明通りの場合、この内容も適用されます。このコマンドは電話番号の前後の情報を保存し、必要な方法でフォーマットします。出力が良く見える場合は、その場所で編集する-i
オプションを追加するか、最後に使用して出力リダイレクトを提供してください。sed
> output_file
sed -E "s/(.*\t.*\t)\+?1?[[:space:]]?\(?([0-9]{3})\)?.*([0-9]{3}).*([0-9]{4})(.*)/\1\(\2\)\ \3-\4\5/g" filename
次のテキストを含むファイルでテストしました。
jfk 902-765-9292 hat jump cat
jk 902 819 2244 hat jump cat
98 902 823-4456 hat jump cat
78h +1 075 242 1566 hat jump cat
jklj kjlj +1 075-242-1566 hat jump cat
jk jkj +1 (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204)-799-9810 hat jump cat
出力は次のとおりです
jfk (902) 765-9292 hat jump cat
jk (902) 819-2244 hat jump cat
98 (902) 823-4456 hat jump cat
78h (075) 242-1566 hat jump cat
jklj kjlj (075) 242-1566 hat jump cat
jk jkj (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204) 799-9810 hat jump cat
答え2
すべての形式に一致し、数値をキャプチャしてから、目的の形式に置き換える正規表現を作成できます。
たとえば、拡張正規表現(ERE)を使用して、オプションで括弧で囲まれた10進数3桁のシーケンスを一致させてキャプチャするには、一致する項目にオプションのハイフンまたはスペースを書き込むことが\(?([0-9]{3})\)?
できます。[- ]?
このように建てられました
\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})
括弧内の3桁の数字(オプション)と一致し、オプションでハイフンまたはスペースが続き、追加の数字(オプションでハイフンまたはスペースが続く)と4桁の数字が一致します。
置換に式を適用sed
:
$ cat <<EOF | sed -E 's/\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})/(\1) \2-\3/g'
I periodically receive a text file with phone numbers formatted
in wildly different ways: 123 456-7890, 123 456-7890, 123 456-7890,
etc. Usually there's ten digits, but I've seen +1 555 456-7890.
EOF
I periodically receive a text file with phone numbers formatted
in wildly different ways: (123) 456-7890, (123) 456-7890, (123) 456-7890,
etc. Usually there's ten digits, but I've seen +1 (555) 456-7890.
答え3
フィールドを一致させ、書式を再指定する必要があります。以下は、3つのバリエーションを見つけてフォーマットを再指定するawkスクリプトです(デフォルトで再編成された行を印刷する前)。
$3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 4, 3) "-" substr($3, 7, 4)
}
$3 ~ /^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 5, 3) "-" substr($3, 9, 4)
}
$3 ~ /^\+1 \([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 5, 3) ") " substr($3, 10, 3) "-" substr($3, 14, 4)
}
1
ファイル(たとえば)に保存したら、phone.awk
次のように呼び出しますawk -F $'\t' -f phone.awk < input
。