为什么我不能这样 grep?

Poz*_*nux 8 grep sed

我想将“disable = yes”行更改为“disable = no”到以下文件中:

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

我试过这个:

[root@centos2 ~]# grep 'disable                 = yes' /etc/xinetd.d/tftp
[root@centos2 ~]#
Run Code Online (Sandbox Code Playgroud)

只需用我的鼠标复制空间,但它并没有 grep 任何东西......

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

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

[root@centos2 xinetd.d]# grep -E 'disable.+= yes' /etc/xinetd.d/tftp
    disable                 = yes
[root@centos2 xinetd.d]#
Run Code Online (Sandbox Code Playgroud)

最后,是否有比以下更好的方法使用 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
    ...
}
Run Code Online (Sandbox Code Playgroud)

编辑 :

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
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 12

空格通常称为“空白”,不仅可以包括空格,还可以包括制表符(和其他“空白”字符)。在正则表达式中,您通常可以使用[[:space:]]\s(取决于 RE 引擎)引用它们,其中包括水平(空格、制表符和一些不同宽度的 unicode 间距字符,如果可用),您也可以使用它们[[:blank:]],有时\h垂直间距字符(如换行、换页、垂直制表符或回车)。[[:space:]]有时用于代替[[:blank:]]它覆盖 Microsoft 文本文件中的虚假回车符。

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

sed '/disable\>/s/\<yes\>/no/' /etc/xinetd.d/tftp
Run Code Online (Sandbox Code Playgroud)

这告诉在包含单词的任何行上sed替换(更改)单词yesinto 。((最初是一个/ regexp 运算符),在某些实现中,强制一个词尾(尽管要注意它不是空格分隔的词,它也会匹配))。方便地,这完全回避了空白问题。nodisable\>exviseddisable-option


小心:对于诸如 之类的行eyes yes,无界yes替换将应用于第一个实例yes并为您留下eno yes。这就是为什么我使用\<yes\>而不仅仅是yes.

  • 你是对的,实际上 - 我可以重现那个。`sed '/disable\&gt;/s/\&lt;yes\&gt;/no/' &lt;&lt;&lt;' disable = yes'` 对我也不起作用(在 MacOS 上,使用 BSD sed)。不过,使用 GNU sed (v4.4) 时,OP 的原始代码对我来说效果很好。 (2认同)

ilk*_*chu 6

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

可能是标签。你可以使用类似的东西

< /etc/xinetd.d/tftp grep disable | od -c
Run Code Online (Sandbox Code Playgroud)

查看。它会将制表符显示为\t,将空格显示为空格。