파일에서 모든 주석을 제거하는 방법은 무엇입니까?

파일에서 모든 주석을 제거하는 방법은 무엇입니까?

댓글이 포함된 파일이 있습니다.

foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this

코멘트 없이 이 파일을 인쇄하고 싶습니다.

foo
bar
stuff
morestuff
evenmorestuff

이는 많은 응용 프로그램에서 도움이 될 수 있습니다. 좋은 방법 없을까요?

답변1

모든 주석을 제거하는 한 가지 방법은 grepwith -o옵션을 사용하는 것입니다:

grep -o '^[^#]*' file

어디

  • -o: 일치하는 것만 인쇄부분선의
  • 첫 번째 ^: 줄의 시작 부분
  • [^#]*#: 0회 이상 반복되는 문자를 제외한 모든 문자

빈 줄도 제거되지만 공백만 있는 줄은 남습니다.

답변2

나는 sed이와 관련하여 더 나은 일을 할 수 있다고 믿습니다 grep.

sed '/^[[:blank:]]*#/d;s/#.*//' your_file

설명하다

  • sed기본적으로 파일은 한 줄씩 표시되며 각 줄은 따옴표 안에 변환을 적용한 후에 인쇄됩니다. ( sed '' your_file모든 줄을 변경하지 않고 인쇄합니다).
  • sed여기서는 각 줄에 실행할 두 개의 명령을 제공합니다 (세미콜론으로 구분).
  • 첫 번째 명령은 다음과 같습니다 /^[[:blank:]]*#/d. 영어에서는 행이 시작 부분의 해시와 일치하면(앞에 공백이 몇 개나옴) 해당 행이 삭제됩니다(인쇄되지 않음).
  • 두 번째 명령은 다음과 같습니다 s/#.*//. 즉, 영어에서는 해시 표시 뒤에 가능한 한 많이(즉, 줄 끝까지) 무엇이든(마지막 두 사이에 공백이 없음 //) 대체합니다.
  • 요약하자면, 이는 파일 전체를 검토하여 주석으로만 구성된 줄을 제거하고 그 뒤에 남은 줄에는 주석이 제거됩니다.

답변3

다른 사람들이 지적했듯이 sed 및 기타 텍스트 기반 도구는 스크립트의 일부가 주석처럼 보이지만 실제로는 주석이 아닌 경우 제대로 작동하지 않습니다. 예를 들어 문자열에서 #을 찾을 수도 있고 매우 일반적인 $#and 를 찾을 수도 있습니다 ${#param}.

나는 다음과 같은 쉘 포맷터를 작성했습니다.옮기다, 코드를 줄이는 기능이 있습니다. 여기에는 댓글 삭제 등이 포함됩니다.

$ cat foo.sh
echo $# # inline comment
# lone comment
echo '# this is not a comment'
[mvdan@carbon:12] [0] [/home/mvdan]
$ shfmt -mn foo.sh
echo $#
echo '# this is not a comment'

파서와 프린터는 Go 패키지이므로 사용자 정의 솔루션을 원한다면 원하는 방식으로 주석을 제거하는 20줄 Go 프로그램을 작성하는 것이 상당히 쉬울 것입니다.

답변4

sed 명령을 사용하여 원하는 출력을 얻을 수 있습니다. 아래 명령이 저에게 효과적이었습니다.

sed 's/#.*$//g' FileName

어디

  • #.*$#- 정규식은 줄의 처음부터 끝까지 모든 문자열을 필터링합니다.

여기서는 이 줄을 삭제해야 하므로 아무것도 바꾸지 않고 "교체" 부분을 건너뜁니다.

  • g- 파일 끝에 도달할 때까지 검색 패턴을 반복한다고 언급했습니다.

sed의 일반 구문:s/regexp/replacement/flags FileName

관련 정보