¿Por qué no puedo hacer grep de esta manera?

¿Por qué no puedo hacer grep de esta manera?

Me gustaría cambiar la línea "disable = yes" por "disable = 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
    ...
}  

Probé esto:

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

simplemente copiando el espacio con el mouse pero no captura nada...

¿Por qué y cómo puedo saber cuáles son los elementos entre "disable" 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, por último, ¿existe una mejor manera de reemplazar "sí" por "no" usando sed que la 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

Respuesta1

Los espacios se conocen más comúnmente como "espacios en blanco" y pueden incluir no sólo espacios sino también tabulaciones (y otros caracteres "en blanco"). En una expresión regular, a menudo puede hacer referencia a estos con [[:space:]]o \s(dependiendo del motor RE), que incluye amboshorizontal(espacio, tabulación y algunos caracteres de espaciado Unicode de varios anchos si están disponibles) para los cuales también puede usar [[:blank:]]y a veces \hyverticalcaracteres de espaciado (como avance de línea, avance de página, tabulación vertical o retorno de carro). [[:space:]]a veces se utiliza 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 su lugar, para reemplazar yescon nopuedes usar un comando como este:

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

Esto indica sedque se sustituya (cambie) la palabra yesen nocualquier línea que contenga la palabra disable. (El \>(inicialmente un operador ex/ viregexp), en algunas sedimplementaciones, fuerza un final de palabra (aunque tenga cuidado, no espalabras delimitadas por espacios en blanco, también coincidiría con disable-option)). Convenientemente, esto evita por completo la cuestión de los espacios en blanco.


Tenga cuidado: con una línea como , se aplicaría eyes yesuna sustitución ilimitada a la primera instancia de y lo dejaría con . Por eso lo he usado en lugar de simplemente .yesyeseno yes\<yes\>yes

Respuesta2

¿Por qué y cómo puedo saber cuáles son los elementos entre "disable" 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.

Respuesta3

Pruebe la alternativa grep llamadatamizardetamizar-tool.org- es un grep con esteroides que realiza una coincidencia inteligente de patrones de expresiones regulares

información relacionada