¿Por qué no puedo grep de esta manera?

8

Me gustaría cambiar la línea "deshabilitar = sí" a "deshabilitar = no" en el siguiente archivo:

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

Intenté esto:

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

simplemente copiando el espacio con mi mouse, pero no atrapa nada ...

¿Por qué y cómo puedo saber cuáles son los elementos entre "deshabilitar" y "="? ¿Son varios espacios? tabulaciones?

Sé que puedo grep usando la siguiente expresión regular:

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

Y finalmente, ¿hay una mejor manera de reemplazar "sí" por "no" usando sed que lo siguiente:

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

EDITAR:

Resultado del comando od gracias @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
Pozinux
fuente

Respuestas:

12

Los espacios se conocen más comúnmente como "espacios en blanco", y pueden incluir no solo espacios sino tabulaciones (y otros caracteres "en blanco"). En una expresión regular que a menudo se puede hacer referencia a estos ya sea con [[:space:]]o \s(dependiendo del motor RE) que incluye tanto horizontal (espacio, lengüeta y algunos caracteres de espaciado Unicode de diversos ancho si está disponible) para el que también se puede utilizar [[:blank:]]y algunas veces \hy vertical de espaciamiento caracteres (como avance de línea, avance de formulario, tabulación vertical o retorno de carro). [[:space:]]a veces se usa en lugar de [[:blank:]]para cubrir el carácter falso de retorno de carro en archivos de texto de Microsoft.

No se puede reemplazar con grep: es solo una herramienta de búsqueda. En cambio, para reemplazar el yescon nopuede usar un comando como este:

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

Esto le indica sedque sustituya (cambie) la palabra yesen nocualquier línea que contenga la palabra disable. (El \>(inicialmente operador a ex/ viregexp), en algunas sedimplementaciones, fuerza el final de la palabra (aunque tenga en cuenta que no son palabras delimitadas por espacios en blanco , también coincidirían disable-option)). Convenientemente, esto evita el problema del espacio en blanco por completo.


Tenga cuidado: con una línea como eyes yes, una yessustitución ilimitada se aplicaría a la primera instancia de yesy lo dejaría con eno yes. Es por eso que he usado en \<yes\>lugar de solo yes.

roaima
fuente
Está bien explicado pero no funciona para mí.
Pozinux
1
@Pozinux No vi que tu disableno estaba al principio de una línea. He modificado mi RE en consecuencia.
roaima
Todavía no hay cambio lo siento.
Pozinux el
2
Tienes razón, en realidad, puedo reproducir eso. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'tampoco funciona para mí (en MacOS, con BSD sed). Sin embargo, el código original del OP funciona bien para mí con GNU sed (v4.4).
Charles Duffy
1
Iba a decir - funciona bien para mí condocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy
6

¿Por qué y cómo puedo saber cuáles son los elementos entre "deshabilitar" y "="? ¿Son varios espacios? tabulaciones?

Probablemente pestañas. Podrías usar algo como

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

para ver. Mostrará pestañas como \ty espacios como espacios.

ilkkachu
fuente
No sabía sobre el comando od, muy agradable! Edité mi pregunta para que pueda ver el resultado del comando od. Si entiendo, no hay pestañas entre el "deshabilitar" y el "=" ¿es correcto? Pero cuantos? ¿Podemos contarlos?
Pozinux el
1
@Pozinux, entonces no hay pestañas entonces. No puedo ver ninguna razón por la que eso grepno debería funcionar, lo siento
Ilkkachu
0

Pruebe la alternativa grep llamada sift de sift-tool.org : es grep en esteroides que hace una coincidencia inteligente de patrones de expresiones regulares

Brandon Haberfeld
fuente
¿Cómo funcionaría eso en esta situación? ¿Puede dar un ejemplo?
roaima