![파일의 동일한 단어에서 두 번째로 나타나는 패턴을 바꾸려면 sed 명령을 사용하지 마십시오.](https://linux55.com/image/135665/%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%8F%99%EC%9D%BC%ED%95%9C%20%EB%8B%A8%EC%96%B4%EC%97%90%EC%84%9C%20%EB%91%90%20%EB%B2%88%EC%A7%B8%EB%A1%9C%20%EB%82%98%ED%83%80%EB%82%98%EB%8A%94%20%ED%8C%A8%ED%84%B4%EC%9D%84%20%EB%B0%94%EA%BE%B8%EB%A0%A4%EB%A9%B4%20sed%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EB%A7%88%EC%8B%AD%EC%8B%9C%EC%98%A4..png)
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 }'
이는 공백으로 구분된 처음 두 개의 필드에서만 교체를 수행한 다음 결과 행을 인쇄합니다.