为什么我不能以这种方式grep?


8

我想将“ 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 ~]#

只需用鼠标复制空间,但不会复制任何内容...

为什么以及如何知道“ disable”和“ =”之间的元素是什么?是几个空格吗?表格?

我知道我可以使用以下正则表达式进行grep:

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

最后,是否有比sed更好的方法用sed将“ yes”替换为“ no”:

[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

Answers:


12

空格通常被称为“空白”,不仅可以包含空格,还可以包含制表符(和其他“空白”字符)。在正则表达式可以经常把这些任一与[[:space:]]\s(取决于RE发动机),其包括两个水平(空格,制表符和各种宽度如果可用的某些Unicode间隔字符),其也可以使用[[:blank:]],有时\h垂直间距字符(例如换行符,换页符,垂直制表符或回车符)。[[:space:]]有时用于代替[[:blank:]]它覆盖Microsoft文本文件中的虚假回车符。

您无法替换grep-它只是一个搜索工具。相反,要替换为yesno您可以使用以下命令:

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

这告诉sed替代(改变)字yesno上包含单词的任何行disable。(\>(在某些实现中,(最初为ex/ viregexp运算符)sed强制使用单词结尾(尽管请注意,它不是用空格分隔的单词,它也将在上匹配disable-option))。方便地,这完全避开了空白问题。


请注意:如果使用一行eyes yes,则无限制yes替换将应用于的第一个实例,yes而您留下eno yes。这就是为什么我使用\<yes\>而不是yes


解释得很好,但对我不起作用。
Pozinux

1
@Pozinux我没看到你disable不在一行的开头。我已经相应地修改了我的RE。
roaima

还是没有变化对不起。
Pozinux

2
您说得对,实际上-我可以重现这一点。sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'也不适合我(在MacOS上,使用BSD sed)。不过,OP的原始代码对我来说对GNU sed(v4.4)来说效果很好。
Charles Duffy

1
会说-与我一起工作很好docker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
查尔斯·达菲

6

为什么以及如何知道“ disable”和“ =”之间的元素是什么?是几个空格吗?表格?

可能是标签。您可以使用类似

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

查看。它将标签显示为\t,并将空格显示为空格。


不知道od命令,非常好!我编辑了问题,以便您可以看到od命令的结果。据我了解,“禁用”和“ =”之间没有制表符,对吗?但是多少?我们可以数一下吗?
Pozinux

1
@Pozinux,所以没有标签。我看不到任何理由为什么那个第一次grep不起作用,对不起
ilkkachu

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.