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