![이 전방 예측 정규식 'string.*?(?= )'이 sed에서 작동하지 않는 이유는 무엇입니까? [복사]](https://linux55.com/image/13604/%EC%9D%B4%20%EC%A0%84%EB%B0%A9%20%EC%98%88%EC%B8%A1%20%EC%A0%95%EA%B7%9C%EC%8B%9D%20'string.*%3F(%3F%3D%20)'%EC%9D%B4%20sed%EC%97%90%EC%84%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
다음과 같은 긴 목록이 있습니다.
AllowedUsers [email protected] [email protected] [email protected] [email protected] .....
모두 한 줄에 있습니다. 기본적으로 많은 사용자 이름@ip
사용자 이름(예: aaa)을 사용하여 찾기 및 바꾸기를 수행한 다음 무엇이든 바꾸고 싶습니다.
정규식을 테스트했습니다(정규식) 예상대로 작동합니다. 하지만 에서 이 작업을 수행하려고 하면 sed
작동하지 않습니다.
$ sed 's/bbbb11.*?(?= )//' test
AllowedUsers [email protected] [email protected] [email protected] [email protected] .....
나는 또한 사용해 보았지만 bbbb11.*?(?=[[:space:]])
작동하지 않았습니다.
내가 놓친 게 무엇입니까?
답변1
긍정적( ?=
) 및 부정적 예측( ?!
) 어설션은 지원되는 도구에서만 제대로 작동합니다.PCRE 확장. GNU sed
나 POSIX 모두 이러한 라이브러리 확장을 지원하지 않습니다. perl
즉시 지원이 필요합니다.
perl -pe 's/bbbb11.*?(?= )//'
또는 정규식 지원 없이도 동일한 목표를 달성할 수 있습니다. 이 간단한 교체를 위해 POSIX와 GNU 모두에서 작동하는 다음을 수행할 수 있습니다.sed
sed 's/\(bbbb11[^ ]*\)//'