sed는 #으로 시작하지만 #으로 시작하지 않는 줄을 삭제합니다! (쉘 스크립트)

sed는 #으로 시작하지만 #으로 시작하지 않는 줄을 삭제합니다! (쉘 스크립트)

을 사용하여 줄을 삭제하려면 #다음 줄을 사용할 수 있습니다.

sed -i "/^\(\\s\)*\\#/d"

하지만 내가 원하는 것은 #대신에로 시작하는 줄을 제거하는 것입니다 #!.

답변1

sed -i -e '/^\s*#\([^!]\|$\)/d'

어디:

  • ^줄의 시작
  • \s*0개 이상의 공백 문자
  • #해시 마크
  • \([^!]\|$\)! 그 뒤에 줄의 끝이 아닌 문자 가 옵니다 .

답변2

sed -i -e '/^#!/p' -e '/^#/d' file

이는 파일을 한 줄씩 반복하고 해당 줄로 시작하는 줄을 찾으면 #!첫 번째 표현식이 인쇄됩니다. 그런 다음 두 번째 표현식에 의해 패턴 공간에서 제거됩니다(즉, 인쇄되지 않습니다).두번째시간은 p사용하지 않을 때 적용되는 기본 명령 에 의해 실행됩니다 sed -n.

just로 시작하는 줄은 #첫 번째 표현식에서는 무시되지만 두 번째 표현식에서는 삭제됩니다.

다른 줄은 p기본 명령으로 인쇄됩니다.

선행 공백을 허용 #하고 다음 줄을 제거합니다.

sed -i -e '/^[[:blank:]]*#!/p' -e '/^[[:blank:]]*#/d' file

[[:blank:]]표현식은 공백이나 탭과 일치합니다.


주석에서 Stéphane이 언급했듯이 첫 번째 표현식에서 로 변경하면 두 번째 p표현식이 일치하는 경우 두 번째 표현식에 관계없이 스크립트가 다음 입력 줄을 계속 사용할 수 있습니다. 이 명령은 미리 정의된 레이블로 분기하거나, 레이블이 지정되지 않은 경우 스크립트 끝으로 분기합니다. 이것은 최적화가 될 것입니다.bsedbsed

답변3

도착하다"그리고"명령 그룹( {...;})이 필요한 두 개의 주소:

sed '/^[[:space:]]*#/{/^#!/!d;}' < file

GNU를 사용하면 내부에서 사용하고 (최신 버전으로 가정) 교체하고 생략할 수 sed있습니다 .-i[[:space:]]\s;

sed -i '/^\s*#/{/^#!/!d}' file

둘 이상을 중첩할 수 있지만 }.C와 D가 아닌 A와 B,그건:

sed '/A/{/B/{/C/!{/D/!d;}' -e '}' -e '}' < file

또는:

sed '
  /A/{
    /B/{
      /C/!{
        /D/!d
      }
    }
  }' < file

답변4

요약: Shebang이 아닌 댓글을 모두 삭제하세요.

sed -e '1{/^\s*\#/{/^\#!/!d}}' -e '1!{/^\s*\#/d}' file

\\작은따옴표(큰따옴표 없음 ) 를 사용하도록 명령을 수정합니다 .

sed '/^\(\s\)*\#/d'

세부 정보(# 뒤에는 별표 [^!] sed '/^\(\s\)*\#[^!]/d'. But that will fail with a line that is empty after the comment (#`가 아닌 항목이 있어야 함) 문자를 추가하는 것만으로도 거의 작동합니다.

이를 위해서는 라인이 끝났음을 어설션해야 합니다( $).

이렇게 하려면 확장된 구문을 사용해야 합니다 ([^!]|$).

sed -E '/^\s*\#([^!]|$)/d'

또는 더 휴대성이 뛰어납니다.

sed -E '/^[ \t]*\#([^!]|$)/d'

하지만 스크립트의 경우 시작 부분의 첫 번째 줄만 #!중요합니다.
선택적 공백과 #으로 시작하는 다른 모든 줄은 주석입니다.

sed -e '1{/^#!/!d}' -e '1!{/^[ \t]*#/d}' file

의미는 다음과 같습니다

첫 번째-e

첫 번째 줄이 주석(공백 및 #)으로 시작하지만 정확히 #이 아닌 경우 제거됩니다.

두번째-e

1!선택적 공백과 #( )으로 시작하는 다른 줄을 제거합니다.

관련 정보