Por que não posso fazer grep dessa maneira?

Por que não posso fazer grep dessa maneira?

Gostaria de alterar a linha "disable = yes" para "disable = no" no seguinte arquivo:

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

Eu tentei isso:

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

apenas copiando o espaço com o mouse, mas ele não faz grep em nada ...

Por que e como posso saber quais são os elementos entre "disable" e "="? São vários espaços? tabulações?

Eu sei que posso usar o grep usando o seguinte regex:

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

E, finalmente, existe uma maneira melhor de substituir "sim" por "não" usando sed do que a seguinte:

[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 do comando od obrigado @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

Responder1

Os espaços são mais comumente conhecidos como "espaços em branco" e podem incluir não apenas espaços, mas tabulações (e outros caracteres "em branco"). Em uma expressão regular, muitas vezes você pode se referir a eles com [[:space:]]ou \s(dependendo do mecanismo RE), que inclui amboshorizontal(espaço, tabulação e alguns caracteres de espaçamento unicode de várias larguras, se disponíveis) para os quais você também pode usar [[:blank:]]e às vezes \heverticalcaracteres de espaçamento (como avanço de linha, avanço de formulário, tabulação vertical ou retorno de carro). [[:space:]]às vezes é usado no lugar de [[:blank:]]para cobrir o caractere de retorno de carro espúrio em arquivos de texto da Microsoft.

Você não pode substituir por grep- é apenas uma ferramenta de pesquisa. Em vez disso, para substituir o yespor novocê pode usar um comando como este:

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

Isto diz sedpara substituir (alterar) a palavra yesinto noem qualquer linha que contenha a palavra disable. (O \>(inicialmente um operador ex/ viregexp), em algumas sedimplementações, força um fim de palavra (embora tenha cuidado, não épalavras delimitadas por espaços em branco, também corresponderia a disable-option)). Convenientemente, isso evita completamente a questão dos espaços em branco.


Tenha cuidado: com uma linha como eyes yes, uma yessubstituição ilimitada se aplicaria à primeira instância de yese deixaria você com eno yes. É por isso que usei \<yes\>em vez de apenas yes.

Responder2

Por que e como posso saber quais são os elementos entre "disable" e "="? São vários espaços? tabulações?

Provavelmente guias. Você poderia usar algo como

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

ver. Ele mostrará tabulações como \te espaços como espaços.

Responder3

Tente a alternativa grep chamadapeneirardesift-tool.org- é grep em steriods que faz correspondência inteligente de padrões regex

informação relacionada