Tôi đang cố gắng grep mọi thứ trong tệp conf không bắt đầu bằng
Các dòng hợp lệ bắt đầu bằng
- hàm băm (hoặc)
- Bất kỳ số lượng khoảng trắng (0 hoặc nhiều hơn) và hàm băm
Regex bên dưới dường như không hoạt động.
grep ^[^[[:blank:]]*#] /opt/logstash/logstash.conf
grep ^[^[[[:blank:]]*#]] /opt/logstash/logstash.conf
grep ^[^[\s]*#] /opt/logstash/logstash.conf
Tôi đang cố gắng hiểu những gì tôi đang làm sai.
FWIW, biểu thức chính quy sau hoạt động:
grep -v '^[[:blank:]]*#' /opt/logstash/logstash.conf
Đầu tiên, nếu bạn không trích dẫn biểu thức chính quy của mình, shell có thể mở rộng nó trước khi grep nhìn thấy nó, vì vậy bạn phải luôn trích dẫn biểu thức chính quy grep của mình.
Thứ hai, lý do tại sao chúng không hoạt động là:[]
, "biểu thức khung", khớp với bất kỳ phần tử nào chứa trong đó hoặc chúng được sử dụng [^ ...]
. Có vẻ như bạn đang cố gắng khớp một chuỗi ký tự phủ định, nhưng đây không phải là []
xong.
Ngoài ra, các lớp ký tự không được đặt trong dấu ngoặc vuông trong biểu thức dấu ngoặc vuông:[^[:blank:]]
thay vì [^[[:blank:]]]
.
Tôi không chắc liệu có phải không -v
Có thể thực hiện được với các biểu thức chính quy cơ bản hoặc mở rộng, nhưng bằng cách sử dụng grep có thể thực hiện các biểu thức chính quy Perl (chẳng hạn như GNU grep), bạn có thể sử dụng giao diện phủ định:
grep -P '^(?![[:blank:]]*#)' /opt/logstash/logstash.conf
Đây là lý do tại sao biểu thức chính quy của bạn không thành công (giả sử chúng được trích dẫn):
^[^[[:blank:]]*#]
– Khớp với bất kỳ dòng nào bắt đầu bằng 0 hoặc nhiều ký tự, không phải bằng chữ [
hoặc để trống, theo sau là #]
^[^[[[:blank:]]*#]]
– Khớp với bất kỳ dòng nào bắt đầu bằng 0 hoặc nhiều ký tự, không phải bằng chữ [
hoặc để trống (lặp lại trong biểu thức ngoặc [[
với đơn [
tương tự), theo sau là #]]
^[^[\s]*#]
- khớp với [
, \
Bất kỳ dòng nào bắt đầu bằng 0 hoặc nhiều ký tự khác ngoài S
(\S
hiện hữu []
không đặc biệt trong ), theo sau là #]
.
Nếu chúng tôi lấy tệp thử nghiệm này:
# bình luận
dòng bình thường
dòng bình thường sau dấu cách
# bình luận sau dấu cách
dòng bình thường sau tab
# bình luận sau tab
abc#] không bắt đầu bằng khoảng trống hoặc [ và có #]
[abc#] bắt đầu bằng [ và có #]
abc#]] không bắt đầu bằng khoảng trống hoặc [ và có #]]
abc#]] bắt đầu bằng khoảng trống và có #]]
sabc#]] bắt đầu bằng s và có #]]
\abc#]] bắt đầu bằng \ và có #]]
Biểu thức khớp như sau:
của bạn grep -v
(có hiệu quả):
$ grep -v '^[[:blank:]]*#' infile
dòng bình thường
dòng bình thường sau dấu cách
dòng bình thường sau tab
abc#] không bắt đầu bằng khoảng trống hoặc [ và có #]
[abc#] bắt đầu bằng [ và có #]
abc#]] không bắt đầu bằng khoảng trống hoặc [ và có #]]
abc#]] bắt đầu bằng khoảng trống và có #]]
sabc#]] bắt đầu bằng s và có #]]
\abc#]] bắt đầu bằng \ và có #]]
我的 grep -P
(có hiệu quả):
$ grep -P '^(?![[:blank:]]*#)' infile
dòng bình thường
dòng bình thường sau dấu cách
dòng bình thường sau tab
abc#] không bắt đầu bằng khoảng trống hoặc [ và có #]
[abc#] bắt đầu bằng [ và có #]
abc#]] không bắt đầu bằng khoảng trống hoặc [ và có #]]
abc#]] bắt đầu bằng khoảng trống và có #]]
sabc#]] bắt đầu bằng s và có #]]
\abc#]] bắt đầu bằng \ và có #]]
Lần thử đầu tiên của bạn:
$ grep '^[^[[:blank:]]*#]' tập tin
abc#] không bắt đầu bằng khoảng trống hoặc [ và có #]
abc#]] không bắt đầu bằng khoảng trống hoặc [ và có #]]
sabc#]] bắt đầu bằng s và có #]]
\abc#]] bắt đầu bằng \ và có #]]
Lần thử thứ hai của bạn:
$ grep '^[^[[[:blank:]]*#]]' infile
abc#]] không bắt đầu bằng khoảng trống hoặc [ và có #]]
sabc#]] bắt đầu bằng s và có #]]
\abc#]] bắt đầu bằng \ và có #]]
Lần thử thứ ba:
$ grep '^[^[\s]*#]' tập tin
abc#] không bắt đầu bằng khoảng trống hoặc [ và có #]
abc#]] không bắt đầu bằng khoảng trống hoặc [ và có #]]
abc#]] bắt đầu bằng khoảng trống và có #]]
Tôi là một lập trình viên xuất sắc, rất giỏi!