2016-02-05 5 views
-1

enter image description hereнайти и заменить точное соответствие шестигранник на нескольких линиях

0070 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 34 
0080 2e 30 20 28 63 6f 6d 70 61 74 69 62 6c 65 3b 20 

Я пытаюсь найти способ, чтобы найти/матч шаблон

2f 34 2e 30 20 28 63 6f 

и заменить его

2f 35 2e 30 20 28 68 63 

Проблема в том, что этот шаблон может быть разбит на две строки различными способами, например 2f 34 2e 30 20 может быть в конце первой строки, а затем остальной шаблон на следующей строке. Я хочу узнать, как я могу найти замену других (больших) шаблонов.

Этот код работает только в том случае, если шаблон полностью содержится в одной строке.

# replace hex equivalent of "/4.0 (co" with "/5.0 (hc" in hex field 
sed 's/2f 34 2e 30 20 28 63 6f/2f 35 2e 30 20 28 68 63/g' <MPFADT$var.txt >>MPFADT$new.txt" 

Я играл с awk и sed, но безрезультатно. Я также рассмотрел примеры perl.

Я уверен, что я могу избавиться от смещения, но это требует слияния, который нарушает форматирование ...

awk -F' ' ' {print " "$2 > file} MPFADT$var.txt 
+0

Обратите внимание на [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+0

Был ли мой ответ или какие-либо другие проблемы решить вашу проблему? Если да, пожалуйста, подумайте о том, чтобы принять его как ваш ответ - нажав полый зеленый галочку/галочку рядом с подсчетом голосов. Если нет, скажите, пожалуйста, что не сработало, чтобы я или кто-то еще помог вам дальше. Благодарю. –

ответ

0

Hex коды могут быть напечатаны с использованием нескольких линий с помощью инструмента, который используется для производят шестнадцатеричный дамп, но шестнадцатеричная строка, содержащаяся в исходном файле, не «разбивается» на несколько строк. Я имею в виду, если бы «2f 34 2e 30 20 28 63 6f» содержала новую строку где-то ... это была бы другая гексагональная последовательность.

То есть, я думаю, вы можете просто использовать СЭД:

$ sed 's/\x2f\x34\x2e\x30\x20\x28\x63\x6f/\x2f\x35\x2e\x30\x20\x28\x68\x63/' your_file 
0

Вот один способ, которым не безразлично, как долго строка вы пытаетесь заменить или сколько строк он разбит на:

$ cat tst.awk 
{ 
    keys[NR] = $1 
    sub(/^[^[:space:]]+[[:space:]]+/,"") 
    buf = (NR>1 ? buf FS : "") $0 
} 
END { 
    gsub(old,new,buf) 
    for (i=1; i<length(buf); i+=(NF*3)) { 
     print keys[++nr] " " substr(buf,i,(NF*3)-1) 
    } 
} 

$ awk -v old="2f 34 2e 30 20 28 63 6f" -v new="2f 35 2e 30 20 28 68 63" -f tst.awk file 
0070 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 
0080 2e 30 20 28 68 63 6d 70 61 74 69 62 6c 65 3b 20 

Он читает весь файл в памяти, хотя, idk, если это проблема для вас или нет. Если это так, вы можете определить buf, чтобы быть максимальным размером и написать код, чтобы повернуть все ваши входные строки через FIFO, делая gsub() каждый раз, когда buf изменений, но это будет более сложным и менее эффективным, и тогда вам нужно будет рассмотреть второй gsub() потенциально работает на данных, которые были изменены 1-м gsub() вместо исходных данных.

0

Вот один из способов сделать это. Сначала дамп файла в простой формат с использованием xxd, который будет подавлять адреса по левую сторону. Теперь удалите все переводы строк, чтобы ничто не могло охватывать несколько строк, так как ваш файл теперь является одной длинной строкой, затем сделайте вашу замену безнаказанно и снова перестройте с помощью xxd. Это требует больше времени, чем делать!

xxd -p input.bin | tr -d '\n' | sed 's/2f342e302028636f/2f352e3020286863/g' | xxd -r -p - patched.bin 

Лучше использовать GNU СЭД, хотя, как это не имеет ограничений на длину линии.

0

Это может работать для вас (GNU СЭД):

sed -r 'N;s/2f(\n.... |)34(\n.... |)2e(\n.... |)30(\n.... |)20(\n.... |)28(\n.... |)63(\n.... |)6f/2f\135\22e\330\420\528\668\763/;P;D' file 

пополняемый окно двух линий и сопоставления с образцом.Поскольку шаблон может происходить в любом месте на выходе, это допускается путем предоставления альтернативных шаблонов между каждой парой символов.

N.B. У вас может быть ограниченный успех, поскольку разбиение на страницы может нарушить корзину яблок.

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