Получая файл фиксированной длины из основного фрейма для одного конкретного атрибута, я получаю ненужный символ, поэтому время, когда этот мусорный символ читается как символ новой строки, в результате все данные были испорчены.
Пример данных в файле
0401000000030020170628000000710000366400201706280002750035*T000100N▒101892928550383900000009201 00000000000008402017062800000020 0000006435000000000000000840A1E098D09D9279BE4000561510A00003220000000000000000000000FF
0401000000030020170628000000710000365400201706280001041125
T000100N▒101909856755446700000018201 00000000000008402017062800000000 00000067540000000000000008402ED730917E9D1DC040000B0810A04003240000000000000000000000FF
Первая запись правильная, хотя я получаю ненужный символ * T000100N▒
, но для второй записи T000100N▒
нежелательный символ читается как новый строчный символ.
В вашем примере 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-й символ )со знаком вопроса.