2012-05-02 5 views
0

Шестигранные символы представлены в форме <9F>. Вокруг них много данных, но меня интересует только регулярное выражение, поэтому я могу удалить их из таблицы с помощью sed, а затем повторно импортировать базу данных.Пытается использовать egrep для вытаскивания только согласованных шестнадцатеричных символов из базы данных

Вот что я пытался до сих пор:

egrep -io '\<[0-9A-Fa-f]{2}\>' /root/database.sql 

И несколько вариаций. Я не могу заставить его работать, и я не знаю, почему. Я пробовал двойное/тройное экранирование и группировку. Он находит пару символов, но не найти < > «s

Так это дает такой вывод:

39 
48 
69 
6F 
B9 

, но мне нужно, чтобы получить полный

<39> 
<48> 
<69> 
<6F> 
<B9> 

ответ

1

Я уверен, что это байты вне диапазона, который может отобразить ваш терминал (либо управляющие символы, либо многобайтовые строки).

Прежде всего, я должен спросить, уверены ли вы в том, что вы хотите очистить это от сбоев данных (ведь кто-то, возможно, ралли хотел вставить запись со словом «über» или что-то еще). Кроме того, я видел, что некоторые базы данных используют управляющие символы, как separaters в файлах дампа БД, а также (Ingres приходит на ум)

Если вы все еще хотите, чтобы вычистить данные, то возможно попробовать это:

Perl -npe ' tr/\ 001- \ 177/cd '

Я набираю это на планшете, поэтому не могу дважды проверить, но это должно удалить любые символы вне 7-битного диапазона ASCII.

0

это работает для меня:

$cat testfile 
<39> <48> 
<60><6F><a4> 

$egrep -io '<[0-9A-Fa-f]{2}>' testfile 

<39> 
<48> 
<60> 
<6F> 
<a4> 
+0

Это очень странно, оно работает для меня в тестовом файле, но не в файле базы данных, поэтому я должен предположить, что фактические данные в db не так, как он появляется, когда я просматриваю его с помощью «less» или «vim ». –

+1

Вы можете попробовать 'od -xa имя_файла | less', чтобы просмотреть содержимое шестнадцатеричного и ascii файла. Это может дать вам лучшее представление о его содержании. Кроме того, 'file filename' расскажет вам, что думает Linux в файле. –

+1

О, и не входите в систему как «root», когда вы экспериментируете. Не бегайте ножницами, всегда наденьте солнцезащитный крем и наденьте свитер - я холодный.:-) –

0

Сбегая от знака меньше и больше, ng слова и конца границ слова. Если вы хотите совместить эти буквенные символы, используйте их unescaped.

Кроме того, вы можете упростить свое регулярное выражение, используя класс символов.

grep -E '<[[:xdigit:]]{2}>' 

Возможно, у вас есть другие непечатаемые символы, которые не совпадают. Как предложил Адам, используйте od или hexdump, чтобы увидеть, что еще может скрываться. Двоичные файлы иногда представлены для вывода с использованием, например, <EF>, без присутствия этих символов. То, что составляет, было бы байтом, имеющим значение 0xEF. Двоичные данные вроде бы не будут работать с sed или grep.

+0

Похоже, что проблема связана с UTF-8 в данных базы данных: http://www.fileformat.info/info/unicode/utf8.htm <80><99> показывает в БД часто, а также и некоторые другие. Я пытаюсь очистить плохие данные, но я не могу работать с ним каким-либо образом, чтобы очистить весь db. –

 Смежные вопросы

  • Нет связанных вопросов^_^