我想将以下文件中的“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
您将单词替换(更改)yes
到no
包含单词 的任何行中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 进行智能正则表达式模式匹配