sed - 일치 항목에서 여러 패턴을 제외하는 방법

sed - 일치 항목에서 여러 패턴을 제외하는 방법

나는 현재 한 가지를 제외하고는 잘 작동하는 sed 세트를 가지고 있습니다.

내가 문제를 겪고 있는 구체적인 표현은 다음과 같습니다.

sed -i '/[^}.to]\.to[[:space:]]/ s/\(\S\)/expect(\1/' ../_spec_seded/"$file"

이제 잘 작동합니다. 기본적으로 표현식의 시작 부분을
찾아 삽입합니다. 특히, 작동하는 일치 항목을 찾을 때 제외됩니다 ..toexpect}.to.to

이제 검색 일치 항목에서 "이것" 또는 "저것"도 제외하고 싶습니다. 나로서는}.to 또는 end.to

즉, 대신에

/[^}.to]\.to[[:space]]/

나는 다음을 가져야 한다:

/[^}.to|^end\.to]\.to[[:space]]/
/[^}.to][^end\.to]\.to[[:space]]/
/[(^}.to|end\.to)]\.to[[:space]]/
/[^(}.to|end\.to)]\.to[[:space]]/

이렇게 사용하면 대괄호를 탈출해야 합니까?

/[^\(}.to|end\.to\)]\.to[[:space]]/

그것도 |?

/[^\(}.to\|end\.to\)]\.to[[:space]]/

게임을 작동시키려고 합니다.

stuff.to do thing
stuff).to do thing
this.to that
all.all.all.to do
pretend.do  # Note this edge case! (pretend contains "end"!) 

하지만

this will be here }.to do
last.end}.to do
all.this at the end.to
none at allend.to

그리고

all.this at the 
end.to # i.e. no spaces before as it is the start of the line.

일반적으로 (모든 언어) 부정에 OR을 사용하는 것은 까다로워 보입니다(오탐으로 인해).

답변1

이 질문에 대한 내 의견에 대한 귀하의 답변을 기다리고 있습니다. 내 답변은 다음과 같습니다.

  • 첫째, [^}.to]원하는 일을 하지 않는다. 그럴 것이다아니요패턴이 없는 행과 일치합니다 }.to. 어떤 것과도 일치한다특징., }, t또는 제외 o. 다시 말해서,많은철사.

  • 일을 더 쉽게 하기 위해 기본적으로 sed아무것도 인쇄하지 않고 모든 것을 인쇄하도록 지시합니다.와는 별개로제외하려는 패턴과 일치하는 행은 다음과 같습니다.

    sed -n '/\(\bend\|}\.to\)/!p' your_file
    

end.to그러면 단어 경계 내에 포함되지 않은 (예: allend.to계산되지 않음) 또는 }.to.

또한 일치하는 줄만 인쇄하려면 \.foo[[:space:]]원하지 않는 패턴과 일치하는 줄을 제거하고 조건부 인쇄를 추가하세요.

sed -n '/\(\bend\|}\.to\)/d;/\.to[[:space:]]/p' your_file

물론 일치와 인쇄 사이에 원하는 대체 항목을 적용할 수 있습니다.

sed -n '/\(\bend\|}\.to\)/d;/\.to[[:space:]]/s/foo/bar/g;p' your_file

답변2

대부분의 경우 이것이 작동하는 것 같습니다.

앞으로:

sed -i 's/[^}.to].to[[:space:]]/).to /' ../_spec_seded/"$file"

뒤쪽에:

sed -i 's/[^}.to|end.to].to[[:space:]]/).to /' ../_spec_seded/"$file"

관련 정보