Intereting Posts
Почему обязательные утилиты POSIX не встроены в оболочку? Команда вроде «paste – -», но отсортированная в алфавитном порядке Поиск сома в Thunar не работает в Xfce где в Ubuntu 14.04 для установки env vars будет использоваться по умолчанию для всех процессов и демонов Измерение скорости передачи USB-накопителя Проблема со словом ntpd Как разрешить доступ к памяти в модуле ядра? Переименование файлов для удаления строк в скобках Как удалить новые строки между данными каждой записи, которые расположены между двумя шаблонами? Используйте команду grep и найдите Как я могу определить, есть ли оставшиеся завершенные транзакции Yum для завершения? OpenBSD 5.2 и Intel GMA X4500: как заставить X Window System работать Проблемы с общей производительностью ceph с QEMU Использование awk для сравнения файлов и объединения вывода из обоих файлов? После установки ubuntu install + software raid 0 мы видим: отказ от ввода-вывода в автономном устройстве

Замените только шестнадцатеричные цифры, игнорируйте, если их меньше или больше, чем 8 цифр Использование команды sed

Пример:


Входные данные:

0x12345678 0aef1234 0098adefa 123456789 

Ожидаемый результат:

 0x00000000 00000000 0098adefa 123456789 

Пробовал это:

 sed -E "s/[0-9a-fA-F]{8}/00000000/g" 

Но это заменяет, даже если есть более 8 шестнадцатеричных цифр.

Вы можете использовать границу слова \b чтобы отметить начало или конец слова, и, кроме того, необходимо учитывать, что перед числом возможен 0x :

 sed -E 's/\b(0x|)[0-9a-fA-F]{8}\b/\100000000/g' 

Тем не менее, есть особые случаи, которые нужно продумать, что с ними делать, например, 00x12345678 , в приведенном выше шаблоне он не заменяется.

В Perl вы можете использовать «проверочные утверждения», то есть вы можете сказать «не предшествует шестнадцатеричной» и «не следует шестнадцатеричной»:

 perl -pe 's/(? 

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

Вы также можете использовать class POSIX [:xdigit:] вместо 0-9a-fA-F .

 $ echo '0x12345678 0aef1234 0098adefa 123456789' | sed -E 's/(\<|x)[[:xdigit:]]{8}\>/\100000000/g' 0x00000000 00000000 0098adefa 123456789 $ echo '12345678 0aef1234 0098adefa 123456789' | sed -E 's/(\<|x)[[:xdigit:]]{8}\>/\100000000/g' 00000000 00000000 0098adefa 123456789 

Регулярное выражение

 (\<|x)[[:xdigit:]]{8}\> 

будет соответствовать шестнадцатеричному числу длиной восемь цифр. Это должно быть полное слово или предшествовать x . Предыдущий символ ( x , если он есть) сохраняется и вставляется перед нулями в замене.