Sed/awk/perl: コンマで区切られた値の逆順、別のテキストを保持

Sed/awk/perl: コンマで区切られた値の逆順、別のテキストを保持

次のテキストがあります。

LABEL1
    .BYTE 01, 02, 03, 04, 05
    .BYTE 01, 02, 03

カンマで区切られた値の順序を逆にするだけです。

LABEL1
    .BYTE 05, 04, 03, 02, 01
    .BYTE 03, 02, 01

次のように処理する必要があります。

ITINERARY_ARRAY_01
    .BYTE <ITINERARY_00A
    .BYTE <ITINERARY_01A
    .BYTE <ITINERARY_02A
    .BYTE <ITINERARY_03A
    .BYTE <ITINERARY_04A
    .BYTE <ITINERARY_05A
    .BYTE <ITINERARY_06A
    .BYTE <ITINERARY_07A
    .BYTE <ITINERARY_08A
    .BYTE <ITINERARY_09A
    .BYTE <ITINERARY_10A
    .BYTE <ITINERARY_11A
    .BYTE <ITINERARY_12A
    .BYTE <ITINERARY_13A
    .BYTE <ITINERARY_14A
;-------------------
ITINERARY_01E
    .BYTE $03, $05, $07, $00
;-------------------
ITINERARY_01F
    .BYTE $03, $05, $07, $09, $00
;-------------------
ITINERARY_01G
    .BYTE $28, $0D, $00
;-------------------
ITINERARY_01H
    .BYTE $28, $0D, $0F, $13, $00
;-------------------
ITINERARY_01I
    .BYTE $28, $0D, $0F, $11, $00
;-------------------
ITINERARY_01J
    .BYTE $03, $05, $07, $09, $20, $1E, $00
;-------------------
ITINERARY_01K
    .BYTE $28, $0D, $0F, $13, $15, $00
;-------------------
ITINERARY_01L
    .BYTE $03, $05, $07, $09, $20, $1E, $1C, $27
    .BYTE $00
;---------------------

「.BYTE」の後の値を除いて、何も変更する必要はありません。この値は16進形式の逆順でなければならず、 "$"を接頭辞として使用します... "編集"してすみませんが、今これを見ました。もう一度ありがとうございます!

ベストアンサー1

私はここでこれをしますsed

sed '/,/!b                                                   
s/\( *[^ ]*\)\(.*\)/\2,\n\1/;:t
s/\([^,]*,\)\(\n.*\)/\2\1/;tt
s/\n\(.*\),/\1/' <<\DATA
LABEL1
    .BYTE 01, 02, 03, 04, 05
    .BYTE 01, 02, 03        
LABEL1
    .BYTE 01, 02, 03, 04, 05
    .BYTE 01, 02, 03
DATA

出力

LABEL1
    .BYTE 05, 04, 03, 02, 01 
    .BYTE 03, 02, 01 
LABEL1
    .BYTE 05, 04, 03, 02, 01 
    .BYTE 03, 02, 01 

現在行にカンマがあることを確認してください。!カンマがない場合、sed bスクリプトは終了し、その行は自動的に印刷されます。行するカンマを含めると、sed次のようになります。

  1. s///まず、次のものを交換してラインを準備します。
    • \( *[^ ]*\)- 0個以上の空白シーケンスが最初に発生した直後に\1引用された0個以上の空白以外の文字シーケンスが表示されます。
    • \(.*\)- オンライン上の他のすべての内容は次のように引用されます\2
    • ...そして\2,\n\1
    • ノート- このように、\n右の代替フィールドにエスケープ文字を使用するs///ことは完全に移植可能ではありません。これをサポートしていない場合は、ステートメントでsedリテラル改行を置き換えることでこれを実行できます。n
  2. :というブランチ/テストタグを定義しますt
  3. それでも動作しますが、sed s///代替は次のとおりです。
    • \([^,]*,\)- ゼロ個以上の非カンマ文字のシーケンスそれから引用された単一のカンマは次のとおりです\1
    • \(\n.*\)\n- 少なくとも1つのewline文字で始まり、パターンスペースに残っているすべての項目/すべての項目が続くシーケンス(\2...で引用)
    • ...そして\2\1
  4. 以前の ests///置換がt成功した場合は、est タグsedに分岐してもう一度やり直してください。:t
  5. 最後に、いくつかのsedクリーンアップと交換:
    • \n\(.*\),- ewline文字が最初に表示され、\n最後にカンマが表示された場合...
    • \1- ...そしてその間のすべて。

sed再帰的置換と同様に、\newline区切り文字は一度に1つのカンマ区切りフィールドの後ろに移動します。\newlineがその行の最初の文字になると、交換は停止します。l再帰交換プロセスの進行方法は次のとおりです。

 01, 02, 03, 04, 05,\n    .BYTE$
 01, 02, 03, 04,\n    .BYTE 05,$
 01, 02, 03,\n    .BYTE 05, 04,$
 01, 02,\n    .BYTE 05, 04, 03,$
 01,\n    .BYTE 05, 04, 03, 02,$
\n    .BYTE 05, 04, 03, 02, 01,$

初期準備の交換後は、sedカンマと挿入された行文字を除いて何も区別されません\n。だからどのカンマで区切られた値はうまく機能します。これは長いビットを実行した結果です。

ITINERARY_ARRAY_01
    .BYTE <ITINERARY_00A
    .BYTE <ITINERARY_01A
    .BYTE <ITINERARY_02A
    .BYTE <ITINERARY_03A
    .BYTE <ITINERARY_04A
    .BYTE <ITINERARY_05A
    .BYTE <ITINERARY_06A
    .BYTE <ITINERARY_07A
    .BYTE <ITINERARY_08A
    .BYTE <ITINERARY_09A
    .BYTE <ITINERARY_10A
    .BYTE <ITINERARY_11A
    .BYTE <ITINERARY_12A
    .BYTE <ITINERARY_13A
    .BYTE <ITINERARY_14A
;-------------------
ITINERARY_01E
    .BYTE $00, $07, $05, $03 
;-------------------
ITINERARY_01F
    .BYTE $00, $09, $07, $05, $03 
;-------------------
ITINERARY_01G
    .BYTE $00, $0D, $28 
;-------------------
ITINERARY_01H
    .BYTE $00, $13, $0F, $0D, $28 
;-------------------
ITINERARY_01I
    .BYTE $00, $11, $0F, $0D, $28 
;-------------------
ITINERARY_01J
    .BYTE $00, $1E, $20, $09, $07, $05, $03 
;-------------------
ITINERARY_01K
    .BYTE $00, $15, $13, $0F, $0D, $28 
;-------------------
ITINERARY_01L
    .BYTE $27, $1C, $1E, $20, $09, $07, $05, $03
    .BYTE $00
;---------------------

おすすめ記事