Tại sao tôi không thể grep theo cách này?


8

Tôi muốn thay đổi dòng "vô hiệu hóa = có" thành "vô hiệu hóa = không" thành tập tin sau:

[root@centos2 ~]# cat /etc/xinetd.d/tftp
service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = yes
    per_source              = 11
    ...
}  

Tôi đã thử điều này:

[root@centos2 ~]# grep 'disable                 = yes' /etc/xinetd.d/tftp
[root@centos2 ~]#

bằng cách chỉ sao chép không gian bằng chuột của tôi nhưng nó không grep gì cả ...

Tại sao và làm thế nào tôi có thể biết các yếu tố giữa "vô hiệu hóa" và "=" là gì? Có phải là một vài không gian? lập bảng?

Tôi biết tôi có thể grep bằng cách sử dụng regex sau:

[root@centos2 xinetd.d]# grep -E 'disable.+= yes' /etc/xinetd.d/tftp
    disable                 = yes
[root@centos2 xinetd.d]#

Và cuối cùng, có cách nào tốt hơn để thay thế "có" bằng "không" bằng cách sử dụng sed hơn sau:

[root@centos2 xinetd.d]# sed -r 's/disable.+= yes/disable                 = 
no/g' /etc/xinetd.d/tftp

service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = no
    per_source              = 11
    ...
}

BIÊN TẬP :

Kết quả của lệnh od cảm ơn @ilkkachu

[root@centos2 xinetd.d]# < /etc/xinetd.d/tftp grep disable | od -c
0000000  \t   d   i   s   a   b   l   e
0000020                                       =       y   e   s  \n
0000037

Câu trả lời:


12

Các khoảng trắng thường được gọi là "khoảng trắng" và có thể bao gồm không chỉ các khoảng trắng mà cả các tab (và các ký tự "trống" khác). Trong một biểu thức thông thường, bạn thường có thể tham khảo các biểu thức này bằng [[:space:]]hoặc \s(tùy thuộc vào công cụ RE) bao gồm cả hai chiều ngang (không gian, tab và một số ký tự khoảng cách unicode có chiều rộng khác nhau nếu có) mà bạn cũng có thể sử dụng [[:blank:]]và đôi khi \hvà khoảng cách dọc các ký tự (như nguồn cấp dữ liệu, nguồn cấp mẫu, tab dọc hoặc trả về vận chuyển). [[:space:]]đôi khi được sử dụng thay thế [[:blank:]]cho việc bao trùm ký tự trả về vận chuyển giả trong các tệp văn bản của Microsoft.

Bạn không thể thay thế bằng grep- nó chỉ là một công cụ tìm kiếm. Thay vào đó, để thay thế yesbằng nobạn có thể sử dụng một lệnh như thế này:

sed '/disable\>/s/\<yes\>/no/' /etc/xinetd.d/tftp

Điều này nói sedđể thay thế (thay đổi) từ yesthành nobất kỳ dòng nào có chứa từ đó disable. (The \>(ban đầu một ex/ vinhà điều hành regexp), trong một số sedtriển khai, lực lượng một từ end-of-(mặc dù coi chừng nó không phải là khoảng trắng được phân định-từ , nó cũng sẽ phù hợp trên disable-option)). Thuận tiện điều này vượt qua vấn đề của khoảng trắng hoàn toàn.


Hãy cẩn thận: với một dòng như eyes yes, một sự yesthay thế không giới hạn sẽ áp dụng cho trường hợp đầu tiên yesvà để lại cho bạn eno yes. Đó là lý do tại sao tôi đã sử dụng \<yes\>thay vì chỉ yes.


Nó được giải thích tốt nhưng không làm việc cho tôi.
Pozinux

1
@Pozinux Tôi không thấy rằng bạn disablekhông ở đầu một dòng. Tôi đã sửa đổi RE của mình cho phù hợp.
roaima

Vẫn không thay đổi xin lỗi.
Pozinux

2
Bạn nói đúng, thực sự - tôi có thể tái tạo điều đó. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'tôi cũng không làm việc (trên MacOS, với BSD sed). Mặc dù vậy, mã gốc của OP hoạt động tốt với tôi với GNU sed (v4.4).
Charles Duffy

1
Sẽ nói - làm việc tốt với tôi vớidocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy

6

Tại sao và làm thế nào tôi có thể biết các yếu tố giữa "vô hiệu hóa" và "=" là gì? Có phải là một vài không gian? lập bảng?

Có lẽ là các tab. Bạn có thể sử dụng một cái gì đó như

< /etc/xinetd.d/tftp grep disable | od -c

nhìn. Nó sẽ hiển thị các tab dưới dạng \tvà khoảng trắng dưới dạng khoảng trắng.


Không biết về lệnh od, rất hay! Tôi đã chỉnh sửa câu hỏi của mình để bạn có thể thấy kết quả của lệnh od. Nếu tôi hiểu, không có tab nào giữa "vô hiệu hóa" và "=" điều này có đúng không? Nhưng có bao nhiêu? Chúng ta có thể đếm chúng?
Pozinux

1
@Pozinux, vậy thì không có tab nào. Tôi không thể thấy bất kỳ lý do nào khiến việc đầu tiên grepkhông hoạt động, xin lỗi
ilkkachu

0

Hãy thử grep thay thế được gọi là sift từ sift-tool.org - là grep trên steriod có khớp mẫu regex thông minh


Làm thế nào mà làm việc trong tình huống này? Bạn có thể đưa ra một ví dụ không?
roaima
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.