Xóa tất cả các dòng bắt đầu bằng # từ một tệp


182

Tất cả các dòng với ý kiến ​​trong một tập tin bắt đầu với #. Làm cách nào tôi có thể xóa tất cả các dòng (và chỉ những dòng đó) bắt đầu bằng #? Các dòng khác có chứa #, nhưng không phải ở đầu dòng nên được bỏ qua.


1
Nó có phải làm việc với quy ước chung #blah \<nl>blahđược tính là một "dòng logic" duy nhất vì dấu gạch chéo ngược thoát khỏi dòng mới không?
đăng

@sarnold: ngoài makecác tiện ích nào sử dụng 'đường nối dấu gạch chéo ngược trước khi kết thúc nhận xét'? Các vỏ (bash và ksh được thử nghiệm) không. C và C ++ thực hiện xử lý nối dòng mới trước khi xử lý các chỉ thị tiền xử lý khác, nhưng chúng là các chỉ thị chứ không phải là nhận xét.
Jonathan Leffler

@Jonathan: Tuyệt vời. Tôi đã giả định rằng lối \<nl>thoát chung cũng sẽ hoạt động trên các bình luận. Nhưng wow tôi đã sai. Tôi chưa thể tìm thấy một ví dụ nào khác ... :) Cảm ơn!
sarnold

Câu trả lời:


302

Điều này có thể được thực hiện với một lớp lót sed :

sed '/^#/d'

Điều này nói, "tìm tất cả các dòng bắt đầu bằng # và xóa chúng, để lại mọi thứ khác."


9
phiên bản ngắn hơn:sed /^#/d
kev

80
Đối với những người yêu thích linux như tôi:sed '/^#/ d' < inputFile.txt > outputFile.txt
Neil McGuigan

50
Phiên bản ngắn nhất : sed -i '/^#/d' filepath.
lesderid

14
sed -i '' '/^#/d' filepathtrên Mac ( vì hậu tố -i là bắt buộc )
paulcm

1
@Viesturs Hãy thử điều này: awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger

56

Tôi hơi ngạc nhiên không ai đề xuất giải pháp rõ ràng nhất:

grep -v '^#' filename

Điều này giải quyết vấn đề như đã nêu.

Nhưng lưu ý rằng một quy ước chung là cho tất cả mọi thứ từ a #đến cuối dòng được coi là một nhận xét:

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

mặc dù điều đó, ví dụ, một #ký tự trong một chuỗi ký tự là phần đầu của một nhận xét (có thể có hoặc không có liên quan đến trường hợp của bạn) (và nó để lại các dòng trống).

Một dòng bắt đầu với khoảng trắng tùy ý theo sau #cũng có thể được coi là một nhận xét:

grep -v '^ *#' filename

nếu khoảng trắng chỉ là khoảng trắng, hoặc

grep -v '^[  ]#' filename

trong đó hai khoảng trắng thực sự là một khoảng trắng được theo sau bởi một ký tự tab theo nghĩa đen (gõ "tab control-v").

Đối với tất cả các lệnh này, bỏ qua filenameđối số để đọc từ đầu vào tiêu chuẩn (ví dụ: như một phần của đường ống).


Tôi đã thêm một câu trả lời mới dựa trên câu trả lời này.
Acumenus

Tôi gặp rắc rối khi sử dụng grep theo cách này trên Windows. Giải pháp là thay thế 'bằng cách", ví dụ:grep -v "^#" filename
SERG

14

Ngược lại với giải pháp của Raymond:

sed -n '/^#/!p'

"không in bất cứ thứ gì, ngoại trừ các dòng KHÔNG bắt đầu bằng #"


9

bạn có thể trực tiếp chỉnh sửa tập tin của bạn với

sed -i '/^#/ d'

Nếu bạn cũng muốn xóa các dòng bình luận bắt đầu với một số khoảng trắng sử dụng

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

Thông thường, bạn muốn giữ dòng đầu tiên của tập lệnh của mình, nếu đó là một sha-bang, vì vậy sedkhông nên xóa các dòng bắt đầu bằng #!. Ngoài ra, nó nên xóa các dòng, chỉ chứa một hàm băm nhưng không có văn bản. đặt nó tất cả cùng nhau:

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

Để phù hợp với tất cả các biến thể sed, bạn cần thêm một phần mở rộng sao lưu vào -itùy chọn:

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

1
cộng 1 cho một không gian
pawar deepaksingh

7

Bạn có thể sử dụng như sau cho một giải pháp awk -

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

5

Câu trả lời này được xây dựng dựa trên câu trả lời trước đó của Keith .

egrep -v "^[[:blank:]]*#" nên lọc ra những dòng bình luận.

egrep -v "^[[:blank:]]*(#|$)" nên lọc cả bình luận và dòng trống, như thường xuyên hữu ích.

Để biết thông tin về [:blank:]và các lớp nhân vật khác, hãy tham khảo https://en.wikipedia.org/wiki/Regular_expression#Character_groupes .


Giả sử egrephỗ trợ của bạn cú pháp đó; phiên bản cũ hơn có thể không.
Keith Thompson

-3

Đây là một vòng lặp cho tất cả các tệp có một số phần mở rộng:

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