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
다음과 같이 이를 달성할 수 있습니다.the
Assume 라인에 최대 하나의 인스턴스가 있다고 가정합니다.:
sed -E 's/.*\Wthe(\W.*)/REPLACED\1/'
the
그러면 마지막 항목까지의 모든 내용이 대체 텍스트로 대체됩니다(정규 표현식은 탐욕적이라는 점을 기억하세요).
- , 로 끝나는 비단어 문자를 포함하여 비단어 문자
the
로 묶인(예: 부분 단어 일치를 방지하기 위해 ) 캡처 그룹에서 마지막으로 발생한 이후의 모든 항목을 저장하여 이를 수행합니다 .theoretical
the
( ... )
\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
// / 및 -R
ast-open // ) 만 알고 있습니다 . 다른 경우 일치 리터럴 또는 AND /match는 오류이거나 (0 또는 1)과 결합된 연산자(0 이상) 로 이해되는 것과 동일 합니다 .-E
-A
-X
-P
sed
?
?
-E
-r
*?
*
*
?
sed
지원되지 않는 구현 의 경우 *?
바꾸려는 내용이 단일 x
문자 인 경우 ( s/[^x]*x/REPLACE/
예:*
x
[^x]
x
x
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/'