단어(문자 아님)까지 바꾸려면 "sed"를 사용하세요.

단어(문자 아님)까지 바꾸려면 "sed"를 사용하세요.

sed구문을 사용하여 문자를 제외하는 방법을 알고 있지만 [^xxxx]단어를 제외하는 방법은 무엇입니까? 예를 들어 내 변수는 다음과 같습니다.

var="
Now is the time
for all good men 
to come 
to the aid  
of the party" 

지금:

echo $var | sed ...

...내가 하고 싶은 말은 다음과 같습니다.

REPLACED time
for all good men 
to come 
REPLACED aid  
REPLACED party 

...간단해야 하는데 어떻게 해야 할지 모르겠습니다.

echo $var | sed -r 's/^[^the]*the/REPLACED/'

... 다소 비슷하지만 t h e단어가 아닌 단일 문자로 일치됩니다 the.

여러 번 발생하는 첫 번째 사건까지 또는 특정 사건이 발생할 때까지 모든 것을 교체할 수 있는 솔루션이 있다면 더 좋을 것입니다.

답변1

다음과 같이 이를 달성할 수 있습니다.theAssume 라인에 최대 하나의 인스턴스가 있다고 가정합니다.:

 sed -E 's/.*\Wthe(\W.*)/REPLACED\1/'

the그러면 마지막 항목까지의 모든 내용이 대체 텍스트로 대체됩니다(정규 표현식은 탐욕적이라는 점을 기억하세요).

  • , 로 끝나는 비단어 문자를 포함하여 비단어 문자 the로 묶인(예: 부분 단어 일치를 방지하기 위해 ) 캡처 그룹에서 마지막으로 발생한 이후의 모든 항목을 저장하여 이를 수행합니다 .theoreticalthe( ... )
  • \1그런 다음 줄을 대체 텍스트로 바꾸고 그 뒤에 캡처 그룹( 검색 패턴에서 첫 번째 그룹이기 때문에 소위 불림)의 내용이 나옵니다 . 종료 문자 the도 대체 텍스트로 전송하려면 약간 더 복잡한 접근 방식이 필요합니다.

전부 교체하고 싶다면첫 번째이런 일이 발생하면 다음 방법을 사용해야 할 수도 있습니다 awk.

awk '(i=match($0,/\Wthe\W/)){print "REPLACED" substr($0,i+4);next} 1'

이는 단어가 아닌 문자로 둘러싸인 문자열이 the해당 줄에 있는지 확인하고 위치를 변수에 저장합니다 i.

  • 0이 아닌 경우 i현재 입력 줄에서 시작하는 대체 텍스트와 하위 문자열을 인쇄합니다.뒤쪽에가 나타나지만 the그렇지 않으면 다음 줄로 실행을 건너뜁니다.
  • 0 이면 i현재 줄을 있는 그대로 인쇄합니다.

답변2

s/.*the/REPLACED/the이것은 .*탐욕스럽고 가능한 많은 일치를 원하기 때문에 맨 오른쪽에서 발생하는 모든 것을 대체합니다 .

.*0자 이상( *)자( .) 입니다.많을수록 좋다the정규식의 다음 부분과 일치해야 하는 마지막 항목을 제외한 모든 항목을 기꺼이 삼켜버릴 것입니다 the.

약 30년 전, 5는 perl이전 콘텐츠와 0개 이상 일치하는 :의 변형을 도입했지만**?가능한 적게:

printf '%s\n' "$var" | perl -pe 's/.*?the/REPLACED/'

이러한 새로운 연산자에 대한 지원을 sed추가한 사람은 거의 없습니다 . perl나는 두 가지 구현( ssed// / 및 -Rast-open // ) 만 알고 있습니다 . 다른 경우 일치 리터럴 또는 AND /match는 오류이거나 (0 또는 1)과 결합된 연산자(0 이상) 로 이해되는 것과 동일 합니다 .-E-A-X-Psed??-E-r*?**?

sed지원되지 않는 구현 의 경우 *?바꾸려는 내용이 단일 x문자 인 경우 ( s/[^x]*x/REPLACE/예:*x[^x]xx

0자 이상의 문자를 최대한 표현할 수 없기 때문에 1자보다 긴 문자열에는 사용할 수 없습니다."the"를 포함하지 마세요.. 따라서 다른 접근 방식이 필요합니다.

s/the/REPLACEMENT/첫 번째 발생을 바꾸십시오. 따라서 문자열이 처음 발생하기 전의 모든 것을 바꾸는 표준의 일반적인 방법은 the이를 개행 문자로 대체한 다음(그렇지 않으면 패턴 공간에 나타나지 않도록 보장됨) sed해당 개행 문자를 바꾸는 것입니다. 이전의 모든 것:

sed 's/the/\
/;s/.*\n//'

답변3

모든 것을 첫 번째 것으로 바꿔야 한다면 the기본 정규식이나 확장 정규식 모두 인식하지 못하는 탐욕스럽지 않은 수량자가 필요할 것입니다.

이 경우 sed필수가 아닌 경우 다음을 사용할 수 있습니다 perl.

perl -pe 's/.*?\Wthe/REPLACED/'

가장 많은 발생을 대체해야 하는 경우 n( n발생 횟수로):

perl -pe 's/(.*?\Wthe){1,n}/REPLACED/'

관련 정보