sed:リバースパターンの置換

sed:リバースパターンの置換

次のファイルがあります.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桁の数字を逆に置き換えます。

数値反転はreversePerl 関数を使用して行われます。

答え3

別のsedオプションには、任意の長さの数値を変更できる柔軟性もあります。

sed -E ':a 3s/-([0-9]+)([0-9])$/-\2-\1/; ta;
        :b 3s/-([0-9])-([0-9]+)$/-\1\2/; tb'

関連情報