예:
입력하다:
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 앞에 삽입됩니다.