파일에서 #으로 시작하는 모든 줄을 삭제하십시오.


182

파일에 주석이있는 모든 줄은로 시작합니다 #. #?로 시작하는 모든 줄과 그 줄만 어떻게 삭제 합니까? 행 #의 시작 부분에 포함 되지 않지만를 포함하는 다른 행은 무시해야합니다.


1
#blah \<nl>blah백 슬래시가 개행을 이스케이프하기 때문에 단일 "논리적 라인"으로 간주되는 공통 규칙을 사용해야 합니까?
sarnold

@sarnold :을 제외하고 make어떤 유틸리티가 '주석을 끝내기 전에 백 슬래시 스플 라이스 라인을 사용합니까?' 쉘 (bash 및 ksh 테스트 됨)은 그렇지 않습니다. C 및 C ++는 다른 전 처리기 지시문을 처리하기 전에 줄 바꿈을 처리하지만 주석이 아닌 지시문입니다.
Jonathan Leffler

@Jonathan : 대단합니다. 나는 일반적인 \<nl>탈출도 의견에 효과 가 있다고 가정했습니다 . 그러나 와우 내가 틀렸다. 아직 다른 예를 찾지 못했습니다 ... :) 감사합니다!
sarnold

답변:


301

이것은 sed one-liner 로 수행 할 수 있습니다 .

sed '/^#/d'

"#으로 시작하는 모든 줄을 찾아서 삭제하고 나머지는 그대로 둡니다."


9
짧은 버전 :sed /^#/d
kev

80
나 같은 리눅스 멍청한 놈의 경우 :sed '/^#/ d' < inputFile.txt > outputFile.txt
닐 맥기 건

49
최단 버전 : sed -i '/^#/d' filepath.
lesderid

14
그리고 sed -i '' '/^#/d' filepath맥 ( -i 접미사는 필수이기 때문에 )
paulcm

1
@Viesturs 이것을 시도하십시오 : awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger

56

아무도 가장 명백한 해결책을 제안하지 않은 것에 약간 놀랐습니다.

grep -v '^#' filename

이렇게하면 명시된대로 문제가 해결됩니다.

그러나 공통된 규칙은 # 줄 끝에서 끝까지 주석으로 처리하는 것입니다.

sed 's/#.*$//' filename

예를 들어 #문자열 리터럴 내의 문자를 주석의 시작으로 처리합니다 (귀하의 경우와 관련이 있거나 그렇지 않을 수 있음) (빈 줄은 남겨 둡니다).

임의의 공백으로 시작하는 줄 # 주석으로 처리 될 수 있습니다.

grep -v '^ *#' filename

공백이 공백 일 경우

grep -v '^[  ]#' filename

여기서 두 공백은 실제로 공백 다음에 리터럴 탭 문자 ( "control-v tab"유형)입니다.

이러한 모든 명령에 대해 filename표준 입력 (예 : 파이프의 일부)에서 읽을 인수를 생략하십시오 .


이 답변을 토대로 새로운 답변 을 추가했습니다 .
Acumenus

Windows에서 grep을 사용하는 데 문제가있었습니다. 해결책은 다음과 같이 '를'으로 대체하는 것입니다. 예 :grep -v "^#" filename
Serg

14

레이몬드 솔루션의 반대 :

sed -n '/^#/!p'

"#로 시작하지 않는 줄을 제외하고는 아무것도 인쇄하지 마십시오."


9

당신은 직접 파일을 편집 할 수 있습니다

sed -i '/^#/ d'

공백 사용으로 시작하는 주석 줄도 삭제하려면

sed -i '/^\s*#/ d'

일반적으로 스크립트의 경우 첫 번째 줄을 유지하려고합니다 .로 sed시작하는 줄을 삭제해서는 안됩니다 #!. 또한 해시 만 포함하고 텍스트는 포함하지 않는 행을 삭제해야합니다. 모두 합쳐서 :

sed -i '/^\s*\(#[^!].*\|#$\)/d'

모든 sed 변형을 준수하려면 -i옵션에 백업 확장을 추가해야합니다 .

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

1
플러스 1 어느 공간 하나
deepaksingh pawar

7

awk 솔루션에 다음을 사용할 수 있습니다.

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile

5

이 답변은 Keith 의 이전 답변을 기반으로합니다 .

egrep -v "^[[:blank:]]*#" 주석 행을 필터링해야합니다.

egrep -v "^[[:blank:]]*(#|$)" 자주 유용한 것처럼 주석과 빈 줄을 모두 필터링해야합니다.

[:blank:]기타 캐릭터 클래스 에 대한 정보는 https://en.wikipedia.org/wiki/Regular_expression#Character_classes참조하십시오 .


귀하의 egrep구문을 지원 한다고 가정 합니다. 이전 버전은 그렇지 않을 수 있습니다.
Keith Thompson

-3

다음은 확장명이있는 모든 파일에 대한 루프입니다.

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.