为什么我不能这样 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 进行智能正则表达式模式匹配

相关内容