파일의 동일한 단어에서 두 번째로 나타나는 패턴을 바꾸려면 sed 명령을 사용하지 마십시오.

파일의 동일한 단어에서 두 번째로 나타나는 패턴을 바꾸려면 sed 명령을 사용하지 마십시오.
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 }'

이는 공백으로 구분된 처음 두 개의 필드에서만 교체를 수행한 다음 결과 행을 인쇄합니다.

관련 정보