Por que não consigo usar o grep dessa maneira?

8

Eu gostaria de mudar 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 meu mouse, mas ele não faz 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 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 o 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
    
por Pozinux 20.11.2017 / 21:09

3 respostas

12

Os espaços são mais conhecidos como "espaços em branco" e podem incluir não apenas espaços, mas guias (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 horizontal (espaço, tabulação e alguns caracteres de espaçamento unicode de várias larguras se disponível) para o qual você também pode usar caracteres de espaçamento [[:blank:]] e às vezes \h e vertical (como alimentação de linha, alimentação de formulário, guia vertical ou retorno de carro). [[:space:]] às vezes é usado no lugar de [[:blank:]] para sua cobertura do caractere de retorno de carro espúrio em arquivos de texto da Microsoft.

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

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

Isso diz a sed para substituir (alterar) a palavra yes em no em qualquer linha que contenha a palavra disable . (O operador \> (inicialmente um ex / vi regexp), em algumas implementações de sed , força um fim de palavra (embora tenha cuidado, não são palavras delimitadas por espaço em branco , também corresponderia em disable-option )). Convenientemente, isso evita completamente a questão do espaço em branco.

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

    
por 20.11.2017 / 21:18
6

Why and how can I know what are the elements between "disable" and "=" ? Is it several spaces? tabulations?

Provavelmente, guias. Você poderia usar algo como

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

para ver. Ele mostrará as guias como \t e espaços como espaços.

    
por 20.11.2017 / 21:27
0

Experimente o grep alternative chamado sift em sift-tool.org - é o grep em steriods que faz o regex inteligente correspondência de padrões

    
por 22.11.2017 / 09:29

Tags