次のファイルがあります.txt
。
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-4321
(682) 543-7890
コマンドを使用して、郵便番号の最後の4桁を逆に変更する必要がありますsed
。出力例:
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890
郵便番号の前にテキストがあり、その間にダッシュがある3行目です。したがって、3行目のダッシュ以降のすべてです。郵便番号が完全に独立している場合にのみこれを実行できます。私は試した:
sed -i -e 's/([0-9])([0-9])([0-9])([0-9])([0-9])-([0-9])([0-9])([0-9])([0-9])/\9\8\7\6/' test.txt
ただし、これを行うと、元に戻して他のすべてのアイテムが削除されます。
答え1
まず、その行に固有のいくつかのパターンを見つけて、コマンドを単純化できます。次の例では、セミコロンが解析される行;
に固有であると仮定します(少なくとも例のテキストでは)sed
。
# capture the last 4 digits of the line and substitute them in reverse order
$ sed '/;/s/\(.\)\(.\)\(.\)\(.\)$/\4\3\2\1/'
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890
答え2
〜のようにもう一つの答えしかし、Perlを使用している場合:
$ perl -lp -e '/;/ && s/(?<=-)\d{4}/reverse $&/e' <file
ABC Corp
1234 7 Oaks Lane
Denton; TX 76509-1234
(682) 543-7890
文字を含む行を見つけて、その行のダッシュ;
の後ろにある4桁の数字を逆に置き換えます。
数値反転はreverse
Perl 関数を使用して行われます。
答え3
別のsed
オプションには、任意の長さの数値を変更できる柔軟性もあります。
sed -E ':a 3s/-([0-9]+)([0-9])$/-\2-\1/; ta;
:b 3s/-([0-9])-([0-9]+)$/-\1\2/; tb'