을 사용하여 줄을 삭제하려면 #
다음 줄을 사용할 수 있습니다.
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
표현식이 일치하는 경우 두 번째 표현식에 관계없이 스크립트가 다음 입력 줄을 계속 사용할 수 있습니다. 이 명령은 미리 정의된 레이블로 분기하거나, 레이블이 지정되지 않은 경우 스크립트 끝으로 분기합니다. 이것은 최적화가 될 것입니다.b
sed
b
sed
답변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!
선택적 공백과 #( )으로 시작하는 다른 줄을 제거합니다.