Làm thế nào tôi có thể Cat Cat một tập tin và loại bỏ các dòng nhận xét?


29

Tôi muốn biết liệu có cách nào để tôi có thể catgửi php.inivà xóa tất cả các dòng bắt đầu bằng;

Ví dụ: nếu tệp chứa này:

;   - 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

và tôi đã chạy lệnh chính xác cat | {remove comments command}, sau đó tôi sẽ kết thúc bằng:

error_reporting  =  E_ALL & ~E_NOTICE

Lưu ý - Tôi cho rằng catsẽ là cách tốt nhất để làm điều này nhưng tôi thực sự tốt với câu trả lời sử dụng tiện ích khác như awk, sed, egrepvv


Một cái gì đó như thế error_reporting = E_ALL & E_NOTICE ; Show all errors, except for noticesnào? Bình luận có nên được loại bỏ trong trường hợp đó là tốt?
CVn

@ MichaelKjorling - Tôi thực sự ổn chỉ với những dòng bắt đầu với những bình luận bị xóa
cwd

1
catlà công cụ để nối các tập tin. greplà công cụ để lọc các dòng dựa trên các mẫu. sedawkcũng có thể sửa đổi những dòng đó.
Stéphane Chazelas

Câu trả lời:



25

Bạn không cần phải đặt một tập tin thông qua grep, grep lấy tên tệp (s) làm dòng lệnh args.

grep -v '^#' file1 file2 file3

sẽ in tất cả các dòng NGOẠI TRỪ những dòng bắt đầu bằng # char. bạn có thể thay đổi char bình luận thành bất cứ điều gì bạn muốn.

Nếu bạn có nhiều hơn một bình luận char (giả sử nó ở đầu một dòng)

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

2
Một cái khác tôi đã làm luôn luôn bị mắc kẹt với tôi là grep '^[^;]' filename. Tôi không thể nói về tính di động của nó mặc dù!
Jodie C

@JodieC, đó là di động nhưng cũng loại bỏ các dòng trống (thường được mong muốn). Các tiêu chuẩn tương đương egrepgrep -E. Người ta cũng có thể sử dụnggrep -ve '^[;#]' -e '^//'
Stéphane Chazelas

9

egrepcó thể giúp bạn tiết kiệm việc sử dụng cat. Nói cách khác, tạo ít quy trình hơn ( egrepvs cat+ egrep) và sử dụng ít bộ đệm hơn (ống từ catđến egrepso với không có ống).

Nói chung, nên hạn chế sử dụng catnếu bạn chỉ muốn truyền một tệp vào một lệnh có thể tự đọc nó.

Với điều này, lệnh sau sẽ xóa các nhận xét, ngay cả khi chúng được thụt vào bằng dấu cách hoặc tab:

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

Thật buồn cười khi bạn kết hợp định dạng regex [[ lớp nhân vật mới hơn ]]với việc sử dụng egreplệnh không dùng nữa trong ít nhất một thập kỷ hoặc lâu hơn.
mikeerv

Thú vị ... các tài liệu hiện tại tại gnu.org/software/grep/manual/html_node/ Khăn bao gồm các lớp POSIX.
Jack Wasey

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

sẽ loại trừ các dòng bắt đầu bằng ';' và các dòng trống.

trong regex, ^biểu thị điểm bắt đầu của một dòng và $kết thúc của một dòng, vì vậy ^$chỉ định các dòng trong đó bắt đầu của ký tự dòng và cuối của ký tự dòng nằm ngay cạnh nhau.


Vì vậy, nếu tôi đang đọc đúng, điều này có thể loại bỏ các dòng nhận xét, nhưng cũng có dòng trống?
cwd

1
@cwd Vâng. Tôi không chắc tại sao anh ấy lại bao gồm cả hai, nhưng nếu bạn chỉ muốn xóa các dòng nhận xét, hãy sử dụngegrep -v '^;'
Michael Mrozek

4
egrep cũng thích các tệp (sử dụng ít bộ đệm và bộ đệm hơn) và một phần thưởng nhỏ sẽ là loại bỏ các bình luận thụt lề quá:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
Chúng ta cần một huy hiệu "vô dụng sử dụng mèo".
Simon Richter

@nrolans - Trông giống như một bình luận phổ biến, tại sao không làm cho nó một câu trả lời?
cwd

2

Một awklót đơn giản awk '/^;/{next}1' input_filenên làm thủ thuật.

[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
Đúng, nhưng dài dòng. Chỉ cần awk '!/^;/' input_filelà đủ.
manatwork

2

Cũng như Jaypal, tôi cũng có thể sẽ sử dụng awkcho các mục đích này. Điều tồi tệ hơn khi đề cập rằng perl đôi khi khá tiện dụng cho các mục đích như vậy:

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

Regexps Perl mạnh hơn so với awk và đôi khi bạn có thể cần chúng.


+1 cho perl, mặc dù con mèo và -l đều dư thừa, vì vậy một cách gọi đơn giản hơn làperl -ne 'print unless /^;/' data.txt
Simon Whitaker

@Simone Whitaker, vâng, bạn đúng - đó chỉ là thói quen viết nó theo cách tôi viết, và nó đáng để đề cập đến nó.
shabunc

1
Điều chắc chắn. Trên thực tế, tôi nghĩ rằng nó cathoạt động tốt trong các ví dụ này nếu bạn coi nó như một proxy cho "bất cứ thứ gì tạo ra văn bản trên STDOUT" chung chung hơn. Ống Unix là thứ tốt nhất kể từ khi bánh mì cắt lát, imho. :)
Simon Whitaker

2

Một chi tiết về câu trả lời của @ shabunc, điều này sử dụng Perl để loại bỏ các bình luận (bao gồm cả các bình luận nội tuyến), sau đó in bất kỳ dòng nào có chứa bất cứ thứ gì ngoài khoảng trắng.

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

Giải trình:

  • s/;.*//sử dụng toán tử thay thế ( s/<regex>/<replacement>/) để thay thế các thể hiện của dấu chấm phẩy và mọi thứ theo sau nó trên một dòng bằng chuỗi rỗng.
  • print if /\S/in dòng nếu nó phù hợp với biểu thức chính \S, đó là lớp ký tự khớp với tất cả các ký tự không phải khoảng trắng.

1

Đây là một cái mà tôi sử dụng, chỉ cần thay thế ';' với ký tự nhận xét (ví dụ: '#' cho nhiều tệp cấu hình dịch vụ UNIX):

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

Điều đó loại bỏ tất cả các bình luận toàn dòng (ngay cả khi chúng có khoảng trắng hàng đầu) và bất kỳ bình luận nào kết thúc các dòng không bình luận, và cũng loại bỏ một cách ngắn gọn các dòng trống khỏi đầu ra. Điều này có thể có thể xảy ra nếu không có đường ống dẫn (sed-or awk-fu của tôi được thừa nhận là không tuyệt vời), nhưng thật dễ để tôi hiểu (và nhớ), tôi đã hình dung rằng tôi sẽ đăng nó ở đây.


1

Ví dụ chỉ hiển thị các dòng + không hiển thị các dòng mới hoặc các dòng emtpy:

$ 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 

HOẶC LÀ

$ 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
Việc sử dụng egreplà không dùng nữa. grep -Elà lệnh bạn đang tìm kiếm ở đây.
mikeerv

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

Tách tất cả các bình luận và các dòng trống từ file.txt


2
Bạn nên xem xét mở rộng câu trả lời của mình với một ít thông tin hơn cho người không quen biết (ví dụ: chính xác những gì regex bạn sử dụng làm).
HalosGhost

egrepđược khấu hao. Sử dụng grep -Evthay thế.
Yokai


0

bạn có thể sử dụng lệnh sau để lưu các dòng, ngoại trừ các dòng trống và các dòng bắt đầu bằng # trong một tệp mới

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


catỐng vô dụng và egrepđược khấu hao và được thay thế bằng grep -Ecác biểu thức mở rộng hoặc chỉ grep -v.
Yokai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.