code

sed가 일치하지 않는 줄을 무시하도록 함

codestyles 2020. 10. 6. 08:12
반응형

sed가 일치하지 않는 줄을 무시하도록 함


sed일부 표현식에 따라 필터 매칭 라인을 만들 수 있지만 일치하지 않는 라인은 인쇄하지 않고 무시할 수 있습니까?

실제 예로, scalac파일 세트에서 (Scala 컴파일러) 를 실행 하고 -verbose생성 된 .class파일을 출력에서 읽고 싶습니다 . scalac -verbose많은 메시지를 출력하지만 우리는 형식의 메시지에만 관심이 [wrote some-class-name.class]있습니다. 내가 현재하고있는 것은 이것이다 ( |&bash 4.0의 stderr를 다음 프로그램으로 파이프하는 방법입니다).

$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'

이렇게하면 우리가 관심있는 메시지에서 파일 이름이 추출되지만 다른 모든 메시지도 변경되지 않은 상태로 전달됩니다! 물론 다음과 같이 할 수도 있습니다.

$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
  sed 's/^\[wrote \(.*\.class\)\]$/\1/'

작동하지만 실제 문제를 해결하는 것과 매우 유사 sed합니다. 입력에서 일치하지 않는 행을 무시 하도록 지시하는 방법 입니다. 그럼 어떻게할까요?


일반 sed의 또 다른 방법 :

sed -e 's/.../.../;t;d'

s///substituion이며, t어떤 레이블이 조건에 모두 다음 명령을 생략하지 않고 d행을 삭제합니다.

perl 또는 grep이 필요하지 않습니다.

(Nicholas Riley의 제안에 따라 편집 됨)


일치하지 않는 줄을 인쇄하지 않으려면 다음 조합을 사용할 수 있습니다.

  • -n sed에게 인쇄하지 않도록 지시하는 옵션
  • p sed에게 일치하는 것을 인쇄하도록 지시하는 플래그

이것은 다음을 제공합니다.

sed -n 's/.../.../p'

Perl 사용 :

... |& perl -ne 'print "$1\n" if /^\[wrote (.*\.class)\]$/'

참고 URL : https://stackoverflow.com/questions/1665549/have-sed-ignore-non-matching-lines

반응형