파일을“cat”하고 주석 처리 된 행을 제거하려면 어떻게합니까?


29

cat파일을 작성 php.ini하고 제거 할 수있는 방법이 있는지 알고 싶습니다.;

예를 들어, 파일에 다음이 포함 된 경우 :

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

올바른 명령을 실행 cat | {remove comments command}하면 다음과 같이 끝납니다.

error_reporting  =  E_ALL & ~E_NOTICE

참고 - 난 그 가정 cat이 작업을 수행하는 가장 좋은 방법이 될 것입니다하지만 같은 다른 유틸리티를 사용하여 답을 실제로 괜찮아 awk, sed, egrep, 등


어떻게 같은 약 error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? 이 경우 주석도 제거해야합니까?
CVn

@ MichaelKjörling-나는 주석이 제거되는 것으로 시작하는 줄로 정말 괜찮습니다
cwd

1
cat파일을 연결하는 도구입니다. grep패턴을 기반으로 선을 필터링하는 도구입니다. sed그리고 awk또한 그 라인을 수정할 수 있습니다.
Stéphane Chazelas

답변:


31

당신이 사용할 수있는:

sed -e '/^;/d' php.ini

25

grep을 통해 파일을 파이프 할 필요가 없습니다. grep은 파일 이름을 명령 줄 인수로 사용합니다.

grep -v '^#' file1 file2 file3

# 문자로 시작하는 행을 제외한 모든 행을 인쇄합니다. 주석 문자를 원하는대로 변경할 수 있습니다.

주석 문자가 두 개 이상인 경우 (행의 시작 부분에 있다고 가정)

egrep -v '^(;|#|//)' filelist

2
내가 항상했던 또 하나는이었다 grep '^[^;]' filename. 나는 그것의 이식성과 말할 수 없다!
Jodie C

@JodieC, 그것은 휴대용이지만 빈 줄을 제거합니다 (원하는 경우가 종종 있습니다). 에 해당하는 표준은 egrep입니다 grep -E. 하나는 사용할 수 있습니다grep -ve '^[;#]' -e '^//'
스테판 Chazelas가

9

egrep의 사용을 절약 할 수 있습니다 cat. 즉, (이하 프로세스 생성 egrepVS cat+가 egrep) 및 (이하에서 파이프 버퍼를 사용 cat하는 egrep아니 파이프 대).

일반적으로 cat파일을 독자적으로 읽을 수있는 명령에 파일을 전달하려는 경우 사용을 제한하는 것이 좋습니다 .

이 명령으로 다음 명령은 공백이나 탭으로 들여 쓰기 되어도 주석을 제거합니다.

egrep -v '^ [[: blank :]] *;' file.ini

새로운 [[ 문자 클래스 ]] 정규식 형식 egrep을 적어도 10 년 정도 더 이상 사용되지 않는 명령 의 사용과 결합하는 것이 재미 있습니다 .
mikeserv

흥미로운 ... gnu.org/software/grep/manual/html_node/의 현재 문서 에는 POSIX 클래스가 포함되어 있습니다.
Jack Wasey

7
egrep -v '^;|^$' $file

';'로 시작하는 줄과 빈 줄은 제외합니다.

정규식에서 ^줄의 시작과 줄 $의 끝을 나타내 므로 ^$줄의 시작 문자와 줄의 끝 문자가 바로 옆에있는 줄을 지정합니다.


그래서 내가 이것을 올바르게 읽으면 주석 처리 된 줄뿐만 아니라 빈 줄도 제거 할 수 있습니까?
cwd

1
@cwd 예. 왜 그가 둘 다를 포함했는지 잘 모르겠지만, 주석 처리 된 행만 제거하려면 다음을 사용하십시오.egrep -v '^;'
Michael Mrozek

4
egrep은 파일도 좋아하고 (프로세스와 버퍼가 적게 사용됨) 약간의 보너스도 들여 쓰기 된 주석을 제거하는 것입니다.egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
우리는 "고용이없는 고양이"배지가 필요합니다.
Simon Richter

@ nrolans-인기있는 의견처럼 보입니다. 왜 대답하지 않습니까?
cwd

2

간단한 awk원 라이너 awk '/^;/{next}1' input_file가 트릭을 수행해야합니다.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
정확하지만 자세합니다. 그냥 awk '!/^;/' input_file충분하다.
manatwork

2

Jaypal뿐만 아니라 awk이러한 목적으로도 사용 됩니다. 펄은 때때로 그러한 목적으로 매우 편리하다는 것을 언급하는 것이 더 나쁩니다.

cat data.txt | perl -lne "print unless /^;/"

Perl 정규 표현식은 awk에 비해 더 강력하며 때로는 필요할 수도 있습니다.


펄의 경우 +1, 고양이와 -l은 모두 중복되므로 더 간단한 호출은perl -ne 'print unless /^;/' data.txt
Simon Whitaker

@Simone Whitaker, 그렇습니다. 맞습니다. 내가 쓰는 방식으로 쓰는 것이 습관이며 언급 할 가치가 있습니다.
shabunc

1
확실한 것. 사실, cat보다 일반적인 "STDOUT에서 텍스트를 생성하는 모든 것"의 프록시로 생각하면이 예제에서 잘 작동 한다고 생각 합니다. 슬라이스 된 빵인 imho 이후로 유닉스 파이프가 가장 좋습니다. :)
Simon Whitaker

2

@ shabunc의 대답에 대한 정교함은 Perl을 사용하여 주석 (인라인 주석 포함)을 제거한 다음 공백 이외의 것을 포함하는 행을 인쇄합니다.

$ perl -ne 's/;.*//; print if /\S/' data.txt

설명:

  • s/;.*//대체 연산자 ( s/<regex>/<replacement>/)를 사용하여 세미콜론 인스턴스와 그 뒤에 오는 모든 것을 빈 문자열로 바꿉니다.
  • print if /\S/공백이 아닌 모든 문자와 일치 \S하는 문자 클래스 인 regexp와 일치하는 경우 행을 인쇄합니다 .

1

여기에 내가 사용하는 것이 있습니다. ';' 주석 문자 (예 : 많은 UNIX 서비스 구성 파일의 경우 '#') :

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

모든 줄 주석 (앞에 공백이 있더라도)과 주석이 아닌 줄을 끝내는 주석을 제거하고 출력에서 ​​빈 줄을 간결하게 제거합니다. 이것은 파이프 라인없이 가능할 수도 있지만 (나의 sed- 또는 awk-fu는 훌륭하지는 않지만) 이해하기 쉽고 기억하기 쉽습니다. 나는 여기에 게시 할 것이라고 생각했습니다.


1

예를 들어 줄만 표시 + 줄 바꿈 또는 빈 줄 표시 안 함 :

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

또는

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
사용 egrep되어 오랫동안 사용되지. grep -E당신이 찾고있는 명령입니다.
mikeserv

0
egrep -v ^'(#|$)' file.txt

file.txt에서 모든 주석과 빈 줄을 제거합니다.


2
시작하지 않은 사람에 대한 정보를 조금 더 제공하여 답변을 확장하는 것을 고려해야합니다 (예 : 정확하게 사용하는 정규식).
HalosGhost

egrep감가 상각됩니다. grep -Ev대신 사용하십시오 .
Yokai


0

새 파일에서 빈 줄과 #으로 시작하는 줄을 제외하고 다음 명령을 사용하여 줄을 저장할 수 있습니다.

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


쓸모없는 cat파이프 egrep는 감가 상각되어 grep -E확장 표현식이나 그냥 대체됩니다 grep -v.
Yokai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.