해결책:

해결책:

파일을 수동으로 검색할 때 주석이 너무 많아서 눈이 번쩍 뜨이고 주석이 없는 줄만 표시할 수 있는 방법이 있었으면 좋겠다는 생각이 들 때가 많습니다.

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에 대한 인수는 비캡처 그룹화를 허용하고 대체 연산자가 작동하도록 허용하는 -PvPerl 정규식 규칙을 사용하도록 지시합니다 . 둘 중 어느 것도 CLI grep에서는 작동하지 않습니다. grep 매뉴얼 페이지에서는 -P 옵션이 실험적이라고 경고하므로 시스템에서 이 옵션을 사용하기 전에 테스트해 보십시오. 일치를 반대로 하여 패턴과 일치하지 않는 행을 반환하도록 지시합니다 . 이들은 결합되어 반대 방향으로 단축될 수 있습니다.--perl-regexp|--invert-matchgrep-vP

이것을 일반 포스트 필터로 사용하는 이유는 세 가지입니다 grep. 첫째, 일반 grep을 수행하고 출력에 주석이 너무 많아 문제가 있는 경우에만 이 기능을 사용하는 추가 작업을 추가할 수 있습니다. (타이핑 횟수가 적고 리소스 사용량도 적습니다.) 둘째, 공통 패턴과 그에 따른 습관을 개발했을 수 있으며, 여기에 복잡성을 더하면 패턴이 깨질 수 있습니다. 디버그 모드에 필요한 것보다 더 많은 작업을 추가하는 것은 낭비되는 작업입니다. 셋째, 여러 줄 주석을 전혀 잘 처리하지 못하지만 필요에 따라 파일을 grep한 경우 결과에서 전부는 아니더라도 대부분의 주석이 제거되어 목적에 부합합니다.

관련 정보