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

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



답변

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

sed '/^#/d'

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


답변

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

grep -v '^#' filename

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

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

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

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

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

grep -v '^ *#' filename

공백이 공백 일 경우

grep -v '^[  ]#' filename

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

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


답변

레이몬드 솔루션의 반대 :

sed -n '/^#/!p'

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


답변

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

sed -i '/^#/ d'

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

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

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

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

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

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


답변

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

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


답변

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

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

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

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


답변

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

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