ホストから固定長ファイルの特定の属性を取得してガベージ文字を取得したため、このガベージ文字が改行文字として読み取られ、結果としてデータ全体が破損しています。
ファイルのデータ例
0401000000030020170628000000710000366400201706280002750035*T000100N▒101892928550383900000009201 00000000000008402017062800000020 0000006435000000000000000840A1E098D09D9279BE4000561510A00003220000000000000000000000FF
0401000000030020170628000000710000365400201706280001041125
T000100N▒101909856755446700000018201 00000000000008402017062800000000 00000067540000000000000008402ED730917E9D1DC040000B0810A04003240000000000000000000000FF
ガベージ文字を受け取りましたが、最初のレコードは正しいです*T000100N▒
が、2番目のレコードの場合、T000100N▒
ガベージ文字は新しい行文字として読み取られます。
答え1
あなたの例でsed
成功:
sed '/^.\{216\}$/!N;s/./?/59' file
このアドレスは、/^.\{216\}$/!
必須の216文字の長さではない行で次のコマンドを実行します。この場合、行が分割され、N
残りの行を読み取ると仮定します。
その後、コマンドはレコードのs
59番目の文字(*
または改行文字)を疑問符で置き換えます(必要に応じて変更)。
これはあなたの例ではうまくいきますが、他のランダムバイトまたはマルチバイト文字がスクリプトを破損するかどうかはわかりません。
したがって、sed
すべての場合で動作しない場合は、次の素晴らしいツールを使用してください。bbe
バイナリデータを含む固定長レコードの処理に最適です。
bbe -b ":219" -e 'r 58 ?' file
-b ":219"
ブロックサイズを219(改行およびマルチバイト文字を含む)として定義し、r 58 ?
オフセット58のバイトを疑問符で置き換えます(したがって59文字)。