16진수 8자리만 바꾸세요. 8자리보다 적거나 많으면 무시하세요. sed 명령 사용

16진수 8자리만 바꾸세요. 8자리보다 적거나 많으면 무시하세요. sed 명령 사용

예:


입력하다:

0x12345678 0aef1234 0098adefa 123456789 

예상 출력:

0x00000000 00000000 0098adefa 123456789

이것을 시도했습니다 :

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

단, 16진수 숫자가 8개 이상 연속되더라도 대체됩니다.

답변1

단어 경계를 사용하여 단어의 시작이나 끝을 표시할 수 있으며 , 숫자 앞에 \b올 수도 있다는 점도 고려하세요 .0x

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

그래도 몇 가지 특별한 경우가 있으므로 이를 처리하는 방법을 고려해야 합니다. 예를 들어 00x12345678위 패턴에서는 대체되지 않습니다.

답변2

Perl에서는 "lookaround 어설션"을 사용할 수 있습니다. 즉, "앞에 16진수 없음" 및 "뒤에 16진수 없음"이라고 말할 수 있습니다.

perl -pe 's/(?<![0-9a-fA-F])[0-9a-fA-F]{8}(?![0-9a-fA-F])/00000000/g'

Lookaround는 일치하는 문자열을 계산하지 않습니다. 즉, 대체되지 않으며 여러 번 일치할 수 있습니다(LookBehind에서 한 번, Lookahead에서 한 번).

[:xdigit:]대신 POSIX 클래스를 사용할 수도 있습니다 0-9a-fA-F.

답변3

$ 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}\>

8자리 16진수 숫자와 일치합니다. 완전한 단어이거나 앞에 가 와야 합니다 x. 앞의 문자( x있는 경우)가 저장되고 교체 시 0 앞에 삽입됩니다.

관련 정보