파일에서 모든 주석을 제거하려면 어떻게해야합니까? this 주석 처리되지

의견이있는 파일이 있습니다.

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