echo "abcdef12cade 12345678 abcdefba12345678" | sed -E "s/[0-9a-fA-F]{8}/00000000/g"
위의 출력은 다음과 같습니다
00000000cade 00000000 0000000000000000
같은 단어에서 두 번째로 나타나는 패턴을 바꾸는 것입니다. 두 번 다시 발생하면 교체하고 싶지 않습니다.
예상 출력
00000000cade 00000000 abcdefba12345678
답변1
일치 항목의 첫 번째 항목만 바꾸려면 g
다음 명령의 접미사를 사용하지 마세요.
$ echo 'aa' | sed 's/a/b/g'
bb
$ echo 'aa' | sed 's/a/b/'
ba
이 g
옵션은 "global"을 나타내며 sed
첫 번째 일치 항목(기본 동작)뿐만 아니라 모든 일치 항목을 바꾸도록 명시적으로 지시합니다.
답변2
처음 8자리 16진수를 대체하여 8~15자 사이의 단어를 찾고 있는 것 같습니다.
sed -E 's/\<[[:xdigit:]]{8}([[:xdigit:]]{0,7})\>/00000000\1/g' <<END
abcdef12cade 12345678 abcdefba12345678 12345 123456789
END
00000000cade 00000000 abcdefba12345678 12345 000000009
여기서 \<
및 \>
는 단어 경계이며 [:xdigit:]
16진수와 일치합니다.
답변3
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 }'
이는 공백으로 구분된 처음 두 개의 필드에서만 교체를 수행한 다음 결과 행을 인쇄합니다.