sed: 패턴을 일치시키고 이후에 나타나는 다른 패턴을 각각 교체합니다. [닫기]

sed: 패턴을 일치시키고 이후에 나타나는 다른 패턴을 각각 교체합니다. [닫기]

내가 가지고 있고 그것이 에 대해 동일한 패턴일 수 있다고 aaaaabaaaaa가정합니다 .ab

패턴 일치를 수행한 다음 aaaaaab'이후'를 모두 '로 바꾸되 '이전'은 바꾸지 않는 방법은 무엇입니까?aaaaabbab

답변1

sed에서는 너무 복잡하지만 Perl에서는 훨씬 쉽습니다.

perl -pe '/b/g and substr($_, pos) =~ s/a/A/g'

첫 번째 일치 항목은 위치가 설정된 문자열의 /b/g첫 번째 항목과 일치합니다 . 그런 다음 해당 위치에서 시작하는 하위 문자열이 대체됩니다.bpos

답변2

sed를 사용하세요. 단, 데이터에 절대 포함되지 않는 문자 시퀀스를 선택해야 합니다.

 ( echo 'zzzaaaaadddd' ; 
   echo 'ssssaaaaajaaaaakaaaaa'; 
   echo 'ssssaaaaaaaaaakaaaaa';  ) | \
      sed '/aaaaa.*aaaaa/ { s/aaaaa/_=|=_/; s/aaaaa/GGGGG/g; s/_=|=_/aaaaa/ }'

zzzaaaaadddd
ssssaaaaajGGGGGkGGGGG
ssssaaaaaGGGGGkGGGGG

설명하다:

  • 최소 2개의 aaaaa 라인이 영향을 받습니다.
  • 바꾸다아아아아_=|=_당신은 결코 가질 수 없는 밧줄을 가지고
  • 다른 사람을 대신하다아아아아너가 원하는 것을해라구구구구
  • _=|=_다시 교체아아아아

답변3

또한 다음 재귀 sed솔루션을 시도해 보세요.

sed ':L; s/\(a*\)b\(a*\)a/\1b\2b/; tL; ' file

모든 대상 이벤트가 완료될 때까지 각 대상 a이벤트를 반복적으로 교체합니다.b

관련 정보