아니요, sed 정규 표현식은 욕심이 일치하지 않습니다.
Perl과 동일하게 “ AC
포함하지 않는 항목 ”을 사용하여 모든 텍스트를 첫 번째 항목까지 일치시킬 수 있습니다 . “포함하지 않는 것은” 정규 표현식으로 쉽게 표현할 수 없습니다. 정규 표현식의 부정을 인식하는 정규 표현식이 항상 있지만 부정 정규 표현식은 빠르게 복잡해집니다. 휴대용 sed에서는 부정 정규 표현식이 확장 정규 표현식 (예 : awk)으로 표시되지만 이식 가능한 기본 정규 표현식에는없는 대체를 그룹화해야하기 때문에 전혀 불가능합니다. GNU sed와 같은 일부 sed 버전에는 가능한 모든 정규 표현식을 표현할 수있는 BRE 확장 기능이 있습니다.AC
AC
.*?AC
AC
sed 's/AB\([^A]*\|A[^C]\)*A*AC/XXX/'
정규식을 부정하기가 어렵 기 때문에 일반화되지 않습니다. 대신 할 수있는 것은 일시적으로 선을 변환하는 것입니다. 일부 sed 구현에서는 줄 바꿈을 입력 줄에 표시 할 수 없으므로 줄 바꿈을 마커로 사용할 수 있습니다 (여러 마커가 필요한 경우 줄 바꿈과 다양한 문자 사용).
sed -e 's/AC/\
&/g' -e 's/AB[^\
]*\nAC/XXX/' -e 's/\n//g'
그러나 일부 sed 버전의 문자 집합에서는 백 슬래시 줄 바꿈이 작동하지 않습니다. 특히 이것은 GNU sed에서 작동하지 않습니다. GNU sed는 내장되지 않은 Linux에서의 sed 구현입니다. GNU sed에서는 \n
대신 사용할 수 있습니다 .
sed -e 's/AC/\
&/g' -e 's/AB[^\n]*\nAC/XXX/' -e 's/\n//g'
이 특정 경우 첫 번째 AC
줄 바꿈으로 바꾸면 충분합니다 . 위에서 제시 한 접근 방식이 더 일반적입니다.
sed에서보다 강력한 접근 방식은 선을 보류 공간에 저장하고, 선의 첫 번째 "관심있는"부분을 제외한 모든 부분을 제거하고, 보류 공간과 패턴 공간을 교환하거나 패턴 공간을 보류 공간에 추가하고 반복하는 것입니다. 그러나 이렇게 복잡한 작업을 시작하면 실제로 awk로 전환하는 것을 고려해야합니다. Awk에는 욕심없는 일치가 없지만 문자열을 분할하고 부품을 변수에 저장할 수 있습니다.