Intereting Posts
Как я могу загрузить полностью зашифрованный дистрибутив вручную из grub> Minimal Bash? Системы компьютерной алгебры с открытым исходным кодом для Linux Удалить строку с пробелами и цитатами из xml-файла Ограничить электронную почту системным пользователям в postfix? Какой сигнал отправляет X своим клиентам, когда он получает SIGINT? Что делает% \ / do (расширение командной строки zsh)? нужна помощь и уточнить с помощью grep & regex Как вы узнаете, что такое код возврата процесса, когда он выходит, и где это значение обычно документируется? Linux сообщает, что процессор слишком медленный? Как найти имя команды для использования утилиты Я пытаюсь написать сценарий bash для преобразования hex в base64 Как отложить / назначить отправку сообщения в альпийском (/ realpine / pine)? Версия версии операционной системы отличается от версии ядра. Это может вызвать проблемы? Почему команда exit не выходит из вложенного цикла? Веб-сервер в зонах Solaris 10 +. Как это сделать правильно?

Не заменяйте второе вхождение шаблона в том же слове в файле командой sed

echo "abcdef12cade 12345678 abcdefba12345678" | sed -E "s/[0-9a-fA-F]{8}/00000000/g" 

вышеизложенное выводит следующее

 00000000cade 00000000 0000000000000000 

это заменяет образец для второго вхождения в том же слове. Я не хочу заменять, если есть второе вхождение.

ожидаемый выход

 00000000cade 00000000 abcdefba12345678 

Если вы хотите заменить только первое совпадение, не используйте суффикс g к команде:

 $ echo 'aa' | sed 's/a/b/g' bb $ echo 'aa' | sed 's/a/b/' ba 

Параметр g означает «глобальный», который явно указывает sed заменить все совпадения, а не только первое (что является поведением по умолчанию).

Похоже, вы ищете слова от 8 до 15 символов и заменяете первые 8 шестнадцатеричных цифр:

 sed -E 's/\<[[:xdigit:]]{8}([[:xdigit:]]{0,7})\>/00000000\1/g' < 
 00000000cade 00000000 abcdefba12345678 12345 000000009 

Где \< и \> - границы слова, а [:xdigit:] соответствует шестнадцатеричной цифре.

g в конце заставляет sed повторить подстановку на линии столько раз, сколько возможно. Вы только хотите сделать это дважды.

Давайте сделаем это с GNU awk :

 echo 'abcdef12cade 12345678 abcdefba12345678' | awk '{ sub("[0-9a-fA-F]{8}", "00000000", $1) sub("[0-9a-fA-F]{8}", "00000000", $2) print }' 

Это выполняет подстановку только в двух первых полях, разделенных пробелами, и затем печатает результирующую строку.