Мне нужно удалить некоторые неизвестные символы и оставшиеся пустые строки из файла, это должно быть просто, и я чувствую себя очень глупо, что я еще не мог этого сделать.
Вот содержимое файла (читаемое):
136;2014-09-07 13:41:25;2014-09-07 13:41:55
136;2014-09-07 13:41:55;2014-09-07 13:42:25
136;2014-09-07 13:42:25;2014-09-07 13:42:55
(empty line)
(empty line)
По какой-то причине этот файл содержит несколько нежелательных/неизвестных символов. HEX это:
fffe 3100 3300 3600 3b00 3200 3000 3100 3400 2d00 3000 3900 :..1.3.6.;.2.0.1.4.-.0.9.
2d00 3000 3700 2000 3100 3300 3a00 3400 3100 3a00 3200 3500 :-.0.7. .1.3.:.4.1.:.2.5.
3b00 3200 3000 3100 3400 2d00 3000 3900 2d00 3000 3700 2000 :;.2.0.1.4.-.0.9.-.0.7. .
3100 3300 3a00 3400 3100 3a00 3500 3500 0d00 0a00 3100 3300 :1.3.:.4.1.:.5.5.....1.3.
3600 3b00 3200 3000 3100 3400 2d00 3000 3900 2d00 3000 3700 :6.;.2.0.1.4.-.0.9.-.0.7.
2000 3100 3300 3a00 3400 3100 3a00 3500 3500 3b00 3200 3000 : .1.3.:.4.1.:.5.5.;.2.0.
3100 3400 2d00 3000 3900 2d00 3000 3700 2000 3100 3300 3a00 :1.4.-.0.9.-.0.7. .1.3.:.
3400 3200 3a00 3200 3500 0d00 0a00 3100 3300 3600 3b00 3200 :4.2.:.2.5.....1.3.6.;.2.
3000 3100 3400 2d00 3000 3900 2d00 3000 3700 2000 3100 3300 :0.1.4.-.0.9.-.0.7. .1.3.
3a00 3400 3200 3a00 3200 3500 3b00 3200 3000 3100 3400 2d00 ::.4.2.:.2.5.;.2.0.1.4.-.
3000 3900 2d00 3000 3700 2000 3100 3300 3a00 3400 3200 3a00 :0.9.-.0.7. .1.3.:.4.2.:.
3500 3500 0d00 0a00 0000 0d00 0a00 :5.5...........
Итак, как вы можете видеть, первые 2 байта - это xFF и xFE, и после каждого символа есть много x00. Концы строк представляют собой соединение 0D00 + 0A00, возврат каретки и перевод строки (\r\n
) плюс x00.
Я хотел удалить эти x00 и первые 2 байта xFFxFE
и последние 4 и преобразовать CRLF
в LF
.
Я мог бы сделать это, используя head, tail и tr:
tr -d '\15\00' < 2014.log | tail -c +3 | head -c -2 > 3.log
Проблема в том, что я не уверен, что файл всегда будет поступать таким образом, поэтому мне нужно создать более общий метод. Я закончил с:
sed 's/\xFF\xFE//g; s/\x00//g; s/\x0D//g' 2014.log > 2.log
or
tr -d '\377\376\00\15' < 2014.log > 2.log
Теперь мне нужно удалить последние две пустые строки, что, как я сказал в начале, должно быть легко, но я не могу этого сделать.
Я пробовал:
sed '/^\s*$/d'
sed '/^$/d'
awk 'NF > 0'
egrep -v "^$"
Other stuff
Но в итоге удаляет только одну из пустых строк, у меня в итоге остается один x0A. Я попытался заменить соединение двух x0Ax0A на sed, даже используя \n\n, но это не сработало. Я не могу удалить все \n
, потому что мне нужны обычные строки, я просто хочу удалить, когда они появляются как минимум два раза подряд. Опять же, я мог бы использовать хвост или голову, чтобы удалить его, но я бы предположил, что все файлы будут поступать таким образом, и это не так.
Я рассматриваю это как простой поиск и замену, но кажется, что это не работает, когда мы работаем с переводом строки.
В информационных целях:
file -i 2014-09-07-13-46-51.log
2014-09-07-13-46-51.log: application/octet-stream; charset=binary
Он не был распознан как текстовый файл... этот файл извлечен из общего объекта флэш-памяти (.sol
).
Поскольку новые файлы могут быть не такими и пришли как обычные текстовые файлы, я не могу просто вырезать файлы, но мне нужно обработать проблемные.
NUL
, в котором я не уверен, что он может что-то сбить, я думаю. Воссоздание этого файла здесь, похоже, конвертируется правильно, но в последней строке есть случайныйNUL
байт. - person Etan Reisner   schedule 09.09.2014RS
илиed
или практически любого языка программирования. - person Etan Reisner   schedule 09.09.2014