
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 \h
everticalcaracteres 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 yes
por no
você pode usar um comando como este:
sed '/disable\>/s/\<yes\>/no/' /etc/xinetd.d/tftp
Isto diz sed
para substituir (alterar) a palavra yes
into no
em qualquer linha que contenha a palavra disable
. (O \>
(inicialmente um operador ex
/ vi
regexp), em algumas sed
implementaçõ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 yes
substituição ilimitada se aplicaria à primeira instância de yes
e 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 \t
e 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