!/空/配布

!/空/配布

大学の課題をやろうとしていましたが、現在詰まっています。目標は、電話番号のいくつかを読み、最初の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

答え2

これは長くて複雑で不要な内容かもしれませんが、sedそれでも興味深いです。

sed -re 'h;    s/^([0-9]*) *(.*)/\1\n/;  :1 s/(.)(.*\n)/\2\1/;t1;  s/.//;  s/^(.*)$/\(\1\)/; x;s/([0-9]{3})(.*)/\2/;x;G;s/\n//'

仕組みは次のとおりです。

      # pretend 214 4234-5555 is the current line
h;    # copy the current line into hold space
s/^([0-9]*) *(.*)/\1\n/;  # keep only first 3 numbers, 214
:1 s/(.)(.*\n)/\2\1/;t1;  s/.//;  # reversing string in sed, 
                                  # see notes below; 214 becomes 412
s/^(.*)$/\(\1\)/;  # After string is reversed, add brackets; (412)
x;s/([0-9]{3})(.*)/\2/; # swap hold and pattern buffer, 
                        # delete first 3 chars; 
                        # pattern space now is <space>4234-5555

x;G;s/\n// # swap again, append hold buffer to pattern buffer; 
            # now pattern buffer is (412)<newline> 4234-5555; 
            # finally delete newline; we get (412) 4234-5555

実際の姿は次のとおりです。

$ printf "214 4234-5555\n123 3333\n" | sed -re 'h;    s/^([0-9]*) *(.*)/\1\n/;  :1 s/(.)(.*\n)/\2\1/;t1;  s/.//;  s/^(.*)$/\(\1\)/; x;s/([0-9]{3})(.*)/\2/;x;G;s/\n//'
(412) 4234-5555
(321) 3333

ノート:文字列反転はもともと以下で見つかりました。Stephen Chazerasの口コミ

答え3

方法1

次の方法を使用して同じ結果を得ます。

i=`awk '{print $1}' example.txt| rev`
awk -v i="$i" '{print i,$2}' example.txt

出力

412 4234-5555

方法2

sed  's/\(.\)\(.\)\(.\)/\3\2\1/' example.txt

出力

412 4234-5555

答え4

Phone.txtの番号が「xxx xxx-xxxx」の場合は、次のものを使用できます。

!/空/配布

echo '('$(catphone.txt | cut -d '' -f1 | rev)')'

関連情報