Por que não posso cumprimentar dessa maneira?

8

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 recebe nada ...

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

Eu sei que posso 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 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
    ...
}

EDIT:

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
Pozinux
fonte

Respostas:

12

Os espaços são mais conhecidos como "espaço 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 referir-se a estes, quer com [[:space:]]ou \s(dependendo do motor RE) que inclui tanto horizontal (espaço, tabulação e alguns caracteres de espaçamento unicode de vários largura se disponível) para o qual você também pode usar [[:blank:]]e às vezes \he vertical, espaçamento caracteres (como avanço de linha, avanço de formulário, guia vertical ou retorno de carro). [[:space:]]às vezes é usado no lugar de [[:blank:]]para cobrir o caractere de retorno de carro falso nos arquivos de texto da Microsoft.

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

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

Isso indica sedpara substituir (alterar) a palavra yesem noqualquer linha que contenha a palavra disable. (O operador \>(inicialmente um ex/ viregexp), em algumas sedimplementações, força um final de palavra (embora tenha cuidado, não são palavras delimitadas por espaços em branco , também corresponderia a disable-option). Convenientemente, isso evita completamente a questão do espaço em branco.


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 eu usei em \<yes\>vez de apenas yes.

roaima
fonte
É bem explicado, mas não funciona para mim.
Pozinux
1
@ Pozinux Eu não vi que o seu disablenão estava no começo de uma linha. Eu alterei meu RE de acordo.
roaima
Ainda nenhuma mudança desculpe.
Pozinux
2
Você está certo, na verdade - eu posso reproduzir isso. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'também não funciona para mim (no MacOS, com BSD sed). O código original do OP funciona bem para mim com o GNU sed (v4.4).
Charles Duffy
1
Ia dizer - funciona bem para mim comdocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy
6

Por que e como posso saber quais são os elementos entre "desativar" 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á guias como \te espaços como espaços.

ilkkachu
fonte
Não sabia sobre o comando od, muito bom! Eu editei minha pergunta para que você possa ver o resultado do comando od. Se eu entendi, não há guias entre o "desativar" e o "=", está certo? Mas quantos? Podemos contá-los?
Pozinux 20/11/19
1
@ Pozinux, então não há guias então. Não vejo nenhuma razão para que esse primeiro grepnão deve trabalhar, desculpe
ilkkachu
0

Experimente a alternativa grep chamada sift do sift-tool.org - é o grep em períodos que faz a correspondência inteligente de padrões de regex

Brandon Haberfeld
fonte
Como isso funcionaria nessa situação? Você pode dar um exemplo?
roaima