!/空/配布

!/空/配布

大学の課題をやろうとしていましたが、現在詰まっています。目標は、電話番号のいくつかを読み、最初の3桁の数字の順序を反転して括弧内に入れることです。電話番号を読むことはできますが、数字は読み取れません。

たとえば、次のようになります。

214 4234-5555

例: 出力

412 4234-5555

これが私が今まで持っているものです

sed -r "s/([0-9]), ([0-9]), ([0-9])/\3\2\1/g" phone.txt

ベストアンサー1

OPの試みを修正

$ cat ip.txt
214 4234-5555
foo 123 4533-3242

$ sed -r 's/([0-9])([0-9])([0-9])/\3\2\1/' ip.txt
412 4234-5555
foo 321 4533-3242

$ # adding parenthesis as well
$ sed -r 's/([0-9])([0-9])([0-9])/(\3\2\1)/' ip.txt
(412) 4234-5555
foo (321) 4533-3242

$ # if ERE is not supported
$ sed 's/\([0-9]\)\([0-9]\)\([0-9]\)/(\3\2\1)/' ip.txt
(412) 4234-5555
foo (321) 4533-3242
  • 一部のsed実装では代わりに-E必要です。-r
  • 補間が必要ない場合は、単一引用符を使用してください。https://mywiki.wooledge.org/Quotes
  • ([0-9]), ([0-9]), ([0-9])カンマとスペースで区切られた3桁の数字と一致します。
  • gその行のすべての項目を変更するには、修飾子が必要です。


一般的なソリューションでは、反転する桁数を数値引数として定義します。

$ perl -pe 's/\d{3}/reverse $&/e' ip.txt
412 4234-5555
foo 321 4533-3242
$ perl -pe 's/\d{3}/sprintf "(%s)", scalar reverse $&/e' ip.txt
(412) 4234-5555
foo (321) 4533-3242

おすすめ記事