파일을 수동으로 검색할 때 주석이 너무 많아서 눈이 번쩍 뜨이고 주석이 없는 줄만 표시할 수 있는 방법이 있었으면 좋겠다는 생각이 들 때가 많습니다.
cat이나 다른 도구를 사용하여 댓글을 건너뛰는 방법이 있나요? 방법이 있고 정규 표현식이 포함된 것 같아요. 나는 그것이 실제로 행 등을 삭제하지 않고 표시하기를 원합니다.
주석은 # 형식이며 xterm으로 zsh를 사용합니다.
답변1
글쎄, 그것은 당신의 의견이 무엇을 의미하는지에 달려 있습니다. a 없이 행만 있는 경우 #
간단합니다.
grep -v '#'
충분할 수도 있습니다(하지만 이 echo '#'
줄은 주석처럼 호출됩니다). 주석 라인이 라인인 경우시작, #
다음이 필요할 수 있습니다.
grep -v '^#'
주석 줄이 #
선택적 공백 뒤에서 시작하는 줄인 경우 다음을 사용할 수 있습니다.
grep -v '^ *#'
댓글 형식이 완전히 다른 경우 이 답변은 도움이 되지 않습니다.
답변2
grep만으로는 진행되는 언어를 이해하지 못하기 때문에 grep만으로는 모든 주석(또는 주석만)을 제거할 수 없습니다. 리뷰가 무엇인지, 무엇이 아닌지 이해하려면 다음을 수행해야 합니다.어휘 분석기특정 언어를 이해하십시오.
특정 프로그래밍 언어의 모든 주석을 제거하는 방법에 대한 몇 가지 답변이 있습니다. 여기에 두 가지 예를 추가하겠습니다.
~을 위한씨이것조쉬 리의 답변생각하다:
gcc -fpreprocessed -dD -E test.c
전처리기를 실행하지만 매크로는 유지합니다.
~을 위한파이썬 unutbu의 답변(나만의 약간의 수정을 거쳐) 토큰화를 사용하여 작은 어휘 분석기를 작성했습니다.
import tokenize
import io
import sys
def nocomment(s):
result = []
g = tokenize.generate_tokens(io.BytesIO(s).readline)
for toknum, tokval, _, _, _ in g:
# print(toknum,tokval)
if toknum != tokenize.COMMENT:
result.append((toknum, tokval))
return tokenize.untokenize(result)
print(nocomment(sys.stdin.read()))
그런 다음 각 프로그래밍 언어 및 사용 사례에 대해 이들 중 하나를 작성할 수 있습니다. Python 어휘 분석기가 호출되었다고 가정합니다.remove-comments.py
#!/bin/sh
case "$1" in
*.py)
remove-comments.py < "$1"
break
;;
*.c|*.C|*.cc)
gcc -fpreprocessed -dD -E "$1"
break
;;
*)
echo I do not know how to remove comments from $1, sorry
break
;;
esac
스크립트 이름을 지정하고 어휘분석기를 추가하세요.필요한/사용하는 언어에 대해. 이는 다양한 파일 형식에서 주석을 제거하기 위한 다소 강력한 디자인이어야 합니다. ( file
대소문자 대신 파일 이름을 사용하는 것도 더 안정적입니다).
답변3
grep -v "^#" your_file | grep -v "^$" | less
"#"으로 시작하는 줄을 제거하고 빈 줄을 삭제한 다음 더 나은 표시를 위해 결과를 에 보냅니다 less
.
답변4
위의 설명에서 언급했듯이 사용 사례에서 "설명"이 어떤 형식을 취하는지에 따라 차이가 있습니다. 그러나 어떤 경우에는 스크립트를 작성하지 않고도 이것만으로 충분할 수 있습니다.
해결책:
grep
질문을 읽으면 이미 파일 검색에 사용했음을 알 수 있으므로 grep
다음과 같이 다른 파이프를 통해 파이프하세요.
grep your_pattern your_file | grep --perl-regexp --invert-match '(?:^;)|(?:^\s*/\*.*\*/)|(?:^\s*#|//|\*)'
갇히지 않은 것:
이렇게 하면 줄에 "트리거" 문자나 줄의 다른 부분, 끝에 주석이 있거나 echo "Hello World" # another comment
여러 줄 주석의 일부일 수 있습니다(아래 설명에서 언급하지 않는 한).
이것을 grep의 사후 필터로 사용하는 경우 대부분의 주석은 여전히 필터링되고 더 이상 "눈이 번쩍 뜨이는" 것에 대해 걱정할 필요가 없으므로 이러한 제한은 무시할 수 있습니다.
설명하다:
세 가지 모드가 있으며 필요에 따라 사용 사례에 맞게 수정할 수 있습니다. 첫 번째는 (?:^;)
문자로 시작하는 줄을 캡처합니다 ;
. 공백 없이 첫 번째 항목이어야 합니다. 두 번째는 , 또는 로 시작하는 줄, catches lines that begin with the `/* ... */` comment style, with or without leading white space. The third
선행 공백이 있거나 없는 줄을 캡처합니다. 마지막 패턴은 여러 줄 주석에서 줄을 캡처하는 데 도움이 됩니다. 여기서 일반적인 스타일은 첫 번째 줄과 마지막 줄을 함께 연결하는 열을 실행하는 것입니다. 예를 들어:#
//
*
*
/* ... */
*
/************
*
* This is my
* multi-line
* comment.
*
************/
각 모드 주변의 기호는 (? ... )
"비캡처" 모드를 만들어 속도를 높이고 리소스 소비를 줄입니다. grep에 대한 인수는 비캡처 그룹화를 허용하고 대체 연산자가 작동하도록 허용하는 -Pv
Perl 정규식 규칙을 사용하도록 지시합니다 . 둘 중 어느 것도 CLI grep에서는 작동하지 않습니다. grep 매뉴얼 페이지에서는 -P 옵션이 실험적이라고 경고하므로 시스템에서 이 옵션을 사용하기 전에 테스트해 보십시오. 일치를 반대로 하여 패턴과 일치하지 않는 행을 반환하도록 지시합니다 . 이들은 결합되어 반대 방향으로 단축될 수 있습니다.--perl-regexp
|
--invert-match
grep
-vP
이것을 일반 포스트 필터로 사용하는 이유는 세 가지입니다 grep
. 첫째, 일반 grep을 수행하고 출력에 주석이 너무 많아 문제가 있는 경우에만 이 기능을 사용하는 추가 작업을 추가할 수 있습니다. (타이핑 횟수가 적고 리소스 사용량도 적습니다.) 둘째, 공통 패턴과 그에 따른 습관을 개발했을 수 있으며, 여기에 복잡성을 더하면 패턴이 깨질 수 있습니다. 디버그 모드에 필요한 것보다 더 많은 작업을 추가하는 것은 낭비되는 작업입니다. 셋째, 여러 줄 주석을 전혀 잘 처리하지 못하지만 필요에 따라 파일을 grep한 경우 결과에서 전부는 아니더라도 대부분의 주석이 제거되어 목적에 부합합니다.