為什麼我不能這樣 grep ?

為什麼我不能這樣 grep ?

我想將以下文件中的“disable = yes”行更改為“disable = no”:

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

我試過這個:

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

只需用滑鼠複製空格,但它不會 grep 任何內容...

為什麼以及如何知道“disable”和“=”之間的元素是什麼?是幾個空格嗎?表格?

我知道我可以使用以下正規表示式 grep :

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

最後,是否有比以下更好的方法使用 sed 將“是”替換為“否”:

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

編輯 :

od 命令的結果感謝@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

答案1

空格通常被稱為“空白”,不僅可以包含空格,還可以包含製表符(以及其他“空白”字元)。在正規表示式中,您通常可以使用[[:space:]]\s(取決於 RE 引擎)來引用它們,其中包括水平的(空格、製表符和一些不同寬度的 unicode 間距字元(如果有))您也可以使用[[:blank:]],有時\h垂直的間隔字元(如換行、換頁、垂直製表符或回車)。[[:space:]]有時使用 代替 來[[:blank:]]覆蓋 Microsoft 文字檔案中的虛假回車符。

您不能替換為grep- 它只是一個搜尋工具。相反,要將 替換yes為,no您可以使用以下命令:

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

這告訴sed您將單字替換(更改)yesno包含單字 的任何行中disable。 (\>(最初是ex/vi正規表示式運算子),在某些sed實作中,強制使用單字結尾(儘管要注意它不是空格分隔的單字,它也會匹配disable-option))。這很方便地完全迴避了空白問題。


請注意:對於諸如 之類的行eyes yes,無限yes替換將應用於第一個實例yes,並留下eno yes。這就是為什麼我使用\<yes\>而不是僅僅使用yes.

答案2

為什麼以及如何知道“disable”和“=”之間的元素是什麼?是幾個空格嗎?表格?

可能是標籤。你可以使用類似的東西

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

查看。它將製表符顯示為\t,空格顯示為空格。

答案3

嘗試 grep 替代方案sift-tool.org- 是 steriods 上的 grep 進行智慧型正規表示式模式匹配

相關內容