댓글이 포함된 파일이 있습니다.
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
코멘트 없이 이 파일을 인쇄하고 싶습니다.
foo
bar
stuff
morestuff
evenmorestuff
이는 많은 응용 프로그램에서 도움이 될 수 있습니다. 좋은 방법 없을까요?
답변1
모든 주석을 제거하는 한 가지 방법은 grep
with -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