sed를 사용하여 여러 정규 표현식 그룹 교체

sed를 사용하여 여러 정규 표현식 그룹 교체

다음 상황 후에 공백을 추가하고 싶습니다.

<span class="negrita">ANYTHING</span>

따라서 다음 SED 명령어를 사용하세요.

sed -E "s/(<span class=\"negrita\">.*?<\/span>)/\1 /g" <<< 'In <span class="negrita">1959</span> economic policy was reoriented in order to undertake <span class="negrita">the country modernization</span>. More text'

나는 다음과 같은 결과를 얻습니다.

In <span class="negrita">1959</span> economic policy was reoriented in order to undertake <span class="negrita">the country modernization</span> . More text

따라서 보시다시피 첫 번째 발생 이후가 아니라 마지막 발생 이후에 공백이 추가됩니다. "/g" 옵션은 모든 항목을 대체해야 한다는 의미가 아닙니까?

미리 감사드립니다.

답변1

*?표준 확장 정규식 연산자가 아닙니다.

sed또는 regexp 엔진의 구현 에 따라

  1. BSD와 같은 오류 보고
  2. GNU 시스템과 .*동일합니다.(.*)?
  3. perlast- open 처럼 작동하는 *?탐욕스럽지 않은 버전*sed
  4. 표준 연산자가 아니기 때문에 무엇이든 또는 모든 작업을 수행합니다.

당신은 그것을 원하는 것 같지만 3그것을 얻고 있는 것 같습니다 2. 아마도 당신 sed이 GNU이기 때문일 것입니다 sed.

이는 -E표준 옵션도 아닙니다 sed(POSIX 사양의 다음 주요 버전에 나타날 수도 있음).

perl정규식 연산자를 사용하려면 다음을 사용해야 합니다 perl.

perl -pe 's:<span class="negrita">.*?</span>:$& :g'

(가정기간s는 중첩되거나 줄로 분할되지 않습니다)

또는 를 사용하여 sed다음을 수행할 수 있습니다(범위의 콘텐츠에 가 포함되어 있지 않다고 가정 <).

sed 's:<span class="negrita">[^<]*</span>:& :g'

답변2

노력하다

sed -E "s/(<span class=\"negrita\">[^<]*?<\/span>)/\1 /g" 

어디

  • [^<]모든 문자를 나타내지만<

귀하의 예를 사용하여 (추가됨 ===)

sed -E "s/(<span class=\"negrita\">[^<]*?<\/span>)/\1=== /g"

제공됨(수동으로 접힘)

In <span class="negrita">1959</span>===  economic policy 
was reoriented in order to undertake <span class="negrita">the 
country modernization</span>=== . More text

관련 정보