의견이있는 파일이 있습니다.
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
주석 처리되지 않은 모든 코드를 인쇄하고 싶습니다.
foo
bar
stuff
morestuff
evenmorestuff
파일에서 주석을 제거 할 수있는 것이 매우 중요합니다.이를 수행하는 좋은 방법은 무엇입니까?
답변
모든 주석을 제거하는 한 가지 방법은 옵션 grep
과 함께 사용 하는 -o
것입니다.
grep -o '^[^#]*' file
어디에
-o
: 줄의 일치하는 부분 만 인쇄합니다- first
^
: 줄의 시작 [^#]*
:#
0 번 이상 반복 된 것을 제외한 모든 문자
빈 줄도 제거되지만 공백 만있는 줄은 유지됩니다.
답변
나는 sed
이것보다 훨씬 더 나은 일을 할 수 있다고 믿는다 grep
. 이 같은:
sed '/^[[:blank:]]*#/d;s/#.*//' your_file
설명
sed
기본적으로 파일을 한 줄씩보고 따옴표로 변환을 적용한 후 각 줄을 인쇄합니다. (sed '' your_file
모든 행을 변경하지 않고 인쇄합니다).- 여기서 우리는
sed
각 줄에서 수행 할 두 가지 명령을 제공 합니다 (세미콜론으로 구분). - 첫 번째 명령은 다음과 같습니다
/^[[:blank:]]*#/d
.. 영어로, 그 줄이 처음에 해시와 일치하면 (앞에 여러 개의 공백이 있음) 해당 줄을 삭제하십시오 (인쇄되지 않음). - 두 번째 명령은 다음과 같습니다
s/#.*//
. 즉 영어에서는 해시 마크로 대체 할 수있는만큼 (줄이 끝날 때까지) 아무것도없는 것 (마지막 두 개 사이의 빈 공간은 없음)을 대체하십시오//
. - 요약하면, 이것은 주석으로 구성된 줄을 삭제하는 줄과 그 뒤에 남겨진 줄을 삭제하는 파일을 통해 실행됩니다.
답변
sed 명령을 사용하여 필요한 출력을 얻을 수 있습니다. 아래 명령은 나를 위해 속임수를 사용했습니다.
sed 's/#.*$//g' FileName
어디에
#.*$
-Regexp는#
줄 끝까지 시작하는 모든 문자열을 필터링합니다.
여기서 우리는 그 줄을 제거하여 비어있는 것으로 바꾸어 ‘교체’부분을 건너 뜁니다.
g
-파일 끝에 도달 할 때까지 패턴의 반복 검색을 언급합니다.
sed의 일반적인 문법 : s/regexp/replacement/flags FileName
답변
다른 사람들이 지적했듯이 스크립트의 일부가 주석처럼 보이지만 실제로는 그렇지 않으면 sed 및 기타 텍스트 기반 도구가 제대로 작동하지 않습니다. 예를 들어 문자열 안에서 #을 찾거나 다소 공통적 인 $#
및을 찾을 수 ${#param}
있습니다.
코드를 축소 하는 기능이있는 shfmt 라는 쉘 포맷터를 작성했습니다 . 여기에는 무엇보다도 주석 제거가 포함됩니다.
$ 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 프로그램을 작성하는 것이 매우 쉽습니다.
답변
다음과 같이 반전 일치를 사용할 수 있습니다.
#grep -v "#" filename
-v, –invert-match 일치하는 의미를 반전시켜 일치하지 않는 행을 선택합니다. (-v는 POSIX에 의해 지정됩니다.)
답변
나는 조셉의 대답을 좋아하지만 // 주석을 제거해야했습니다. 그래서 약간 수정하고 redhat에서 테스트했습니다.
# no comments alias
alias nocom="sed -E '/^[[:blank:]]*(\/\/|#)/d;s/#.*//' | strings"
# example
cat SomeFile | nocom | less
문자열을 사용하는 것보다 빈 줄을 제거하는 더 좋은 방법이 있지만 내 생각에는 빠르고 더러운 솔루션이었습니다.
-건배
답변
이것은 나를 위해 일했다
sed -i.old -E "/^(#.*)$/d" file