이와 같이 sed를 수행하지만 bbe에서는 일치/교체하는 방법:
echo "abc894576def559872364abc23948572348576def" |sed -r "s@(abc[0-9]).*(def)@\1CCC\2@"
왜냐하면 이것은 아무것도 하지 않기 때문입니다:
echo "abc894576def559872364abc23948572348576def" |bbe -e "s@(abc[0-9]).*(def)@\1CCC\2@"
개행 문자를 무시해야 하기 때문에 필요합니다 bbe
. 즉, 구분 기호처럼 바이너리에서 발견된 마지막 일치 항목이 아니라 첫 번째 일치 항목으로 "def"가 필요하므로 정규식은 아직 좋지 않습니다...
답변1
-r
귀하는 이 옵션을 귀하의 옵션과 함께 사용하고 있으므로 GNU( 확장 정규 표현식을 위한 이 옵션의 GNU 전용 버전 )를 sed
사용하고 있는 것입니다 . 따라서 달성하려는 것이 개행 문자도 포함하는 것이라면 개행 문자 대신 구분 기호로 0바이트를 사용하는 GNU 옵션을 사용하십시오.sed
-r
-E
E
.*
-z
sed
sed -zE "s@(abc[0-9]).*(def)@\1CCC\2@"
다른 sed
버전의 경우 다음과 같이 패턴 공간의 모든 행을 가져와야 합니다.
sed -E "H;1h;$!d;x;s@(abc[0-9]).*(def)@\1CCC\2@"
이는 마지막 라인까지 예약된 공간의 모든 라인을 수집한 후 버퍼를 교환하여 전체 파일을 한 번에 처리합니다. 그러나 대용량 파일의 경우 버퍼 크기 제한에 유의하세요.
다음 문제는 첫 번째 def
일치를 원하기 때문에 Perl의 non-greedy 일치가 필요 .*?
하지만 하나도 없기 sed
때문에 파일에 속하지 않는 문자를 사용하여 이 문제를 해결해야 한다는 것입니다. , #
이 예를 들어보겠습니다. 예를 들면 다음과 같습니다.
sed -zE "s@def@#@g;s@(abc[0-9]).[^#]*#@\1CCC#@;s@#@def@g"
패턴을 단일 문자로 바꾸면 역방향 일치를 사용하여 [^#]
찾고 있는 문자를 제외한 모든 문자를 일치시킬 수 있습니다. 존재한다고 확신하는 경우 패턴 끝에 있는 패턴을 def
삭제하고 교체할 수도 있습니다 .#