파일에서 특정 텍스트가 포함 된 행을 제거하십시오.

이메일 목록이있는 파일이 있고 각 행에 이메일이 있습니다. example.com 또는 test.com 문자열이 포함 된 줄을 제거하고 싶습니다.

다음을 시도했습니다 :

sed -i "s/example\.com//ig" file.txt 

하지만 example.com 문자열 만 제거됩니다. 전체 줄을 제거하려면 어떻게해야합니까?

Answer

GNU sed :

sed "/example\.com/d;/test\.com/d" -i file.txt 

example.comtest.com.

man sed에서 :

d Delete pattern space. Start next cycle. 

댓글

  • 이렇게하면 example (또는 test) 뒤에 아무 문자 나 com가 나옵니다. 예 echo 'exampleAcom' | sed '/example.com/d'
  • Gah, 점을 벗어나지 않고 무심코 멍청 해. 알아 주셔서 감사합니다!

답변

POSIXly, grep :

grep -Eiv "(example|test)\.com" <in >out 

설명

  • 입력 및 출력에 동일한 파일을 사용하지 않도록주의하세요. 또는 grep가 읽을 수 있기 전에 잘립니다.

답변

정규식은 example.com 와만 일치하고 sedexample.com 만 비어있는 것으로 바꿉니다. 끈. 정규식은 example.com 또는 test.com을 포함하는 모든 줄과 일치해야합니다.

sed -i "s@.*\(test\|example\)\.com.*@@i" file.txt 

댓글

  • 대답은 일치하는 줄을 삭제하지 않습니다. 비워 둘뿐입니다. – 또한 대소 문자를 구분하지 않는 텍스트를 처리하지 않습니다 (OP '의 예에 따라). –. g는 중복되거나 의미가 없습니다. sed ‍ '의 정규식이 탐욕 스럽기 때문에 선행 및 후행 .*는 텍스트 일치의 첫 번째 발생이 전체 줄과 일치하도록합니다. ‍
  • 의견 주셔서 감사합니다. ' 대소 문자 구분에주의를 기울이지 않았습니다. g는 제 습관입니다. 당신 말이 맞습니다. 꼭 필요한 것은 아닙니다. 또한 블랭킹 라인이 OP가 원하는 것이라고 생각했습니다. 이제 모든 것이 명확합니다. 감사합니다

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다