Perché non posso grep in questo modo?


8

Vorrei cambiare la riga "disable = yes" in "disable = no" nel seguente file:

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

Ho provato questo:

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

semplicemente copiando lo spazio con il mouse, ma non viene visualizzato nulla ...

Perché e come posso sapere quali sono gli elementi tra "disable" e "="? Sono diversi spazi? tabulazioni?

So che posso grep usando il seguente regex:

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

E infine, c'è un modo migliore di sostituire "sì" con "no" usando sed rispetto al seguente:

[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
    ...
}

MODIFICARE :

Risultato del comando od grazie a @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

Risposte:


12

Gli spazi sono più comunemente conosciuti come "spazi bianchi" e possono includere non solo spazi ma schede (e altri caratteri "vuoti"). In un'espressione regolare puoi spesso fare riferimento a questi con [[:space:]]o \s(a seconda del motore RE) che include sia caratteri orizzontali (spazio, tabulazione e alcuni caratteri di spaziatura unicode di varia larghezza se disponibili) per i quali puoi anche usare [[:blank:]]e talvolta \he spaziatura verticale caratteri (come avanzamento riga, avanzamento modulo, scheda verticale o ritorno a capo). [[:space:]]viene talvolta utilizzato al posto di [[:blank:]]per la copertura del carattere di ritorno a capo spurie nei file di testo Microsoft.

Non puoi sostituirlo con grep- è solo uno strumento di ricerca. Invece, per sostituire il yescon nopuoi usare un comando come questo:

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

Questo dice seddi sostituire (cambiare) la parola yesin noqualsiasi riga che contiene la parola disable. (L' operatore \>(inizialmente un operatore ex/ viregexp), in alcune sedimplementazioni, forza un end-of-word (anche se attenzione che non sono parole delimitate da spazi bianchi , corrisponderebbe anche su disable-option)). Convenientemente, questo elude completamente il problema degli spazi bianchi.


Fai attenzione: con una linea come eyes yes, una yessostituzione illimitata si applicherebbe alla prima istanza di yese ti lascerebbe con eno yes. Ecco perché ho usato \<yes\>invece di solo yes.


È ben spiegato ma non funziona per me.
Pozinux il

1
@Pozinux Non ho visto che il tuo disablenon era all'inizio di una riga. Ho modificato la mia RE di conseguenza.
roaima,

Ancora nessun cambiamento mi dispiace.
Pozinux il

2
Hai ragione, in realtà - posso riprodurlo. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'non funziona neanche per me (su MacOS, con BSD sed). Tuttavia, il codice originale dell'OP funziona bene con GNU sed (v4.4).
Charles Duffy,

1
Stavo per dire - funziona benissimo con medocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy il

6

Perché e come posso sapere quali sono gli elementi tra "disable" e "="? Sono diversi spazi? tabulazioni?

Probabilmente schede. Potresti usare qualcosa del genere

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

vedere. Mostrerà le schede come \te gli spazi come spazi.


Non sapevo del comando od, molto bello! Ho modificato la mia domanda in modo che tu possa vedere il risultato del comando od. Se ho capito, non ci sono schede tra "disable" e "=" è giusto? Ma quanti? Possiamo contarli?
Pozinux il

1
@Pozinux, quindi nessuna scheda allora. Non riesco a vedere alcun motivo per cui prima grepnon dovrebbe funzionare, mi spiace
ilkkachu,

0

Prova l'alternativa grep chiamata sift da sift-tool.org - è grep su steriods che esegue una corrispondenza intelligente dei pattern regex


Come funzionerebbe in questa situazione? Puoi fare un esempio?
roaima,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.