Pourquoi ne puis-je pas grep de cette façon?

8

Je voudrais changer la ligne "disable = yes" en "disable = no" dans le fichier suivant:

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

J'ai essayé ceci:

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

en copiant juste l'espace avec ma souris mais ça ne grep rien ...

Pourquoi et comment puis-je savoir quels sont les éléments entre "désactiver" et "="? S'agit-il de plusieurs espaces? tabulations?

Je sais que je peux grep en utilisant l'expression régulière suivante:

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

Et enfin, existe-t-il une meilleure façon de remplacer «oui» par «non» en utilisant sed que ce qui suit:

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

ÉDITER :

Résultat de la commande od merci @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
la source

Réponses:

12

Les espaces sont plus communément appelés «espaces blancs» et peuvent inclure non seulement des espaces mais des tabulations (et d'autres caractères «vides»). Dans une expression régulière, vous pouvez souvent vous y référer avec [[:space:]]ou \s(selon le moteur RE) qui comprend à la fois horizontal (espace, tabulation et quelques caractères d'espacement unicode de différentes largeurs si disponibles) pour lesquels vous pouvez également utiliser [[:blank:]]et parfois \het l' espacement vertical caractères (comme le saut de ligne, le saut de page, la tabulation verticale ou le retour chariot). [[:space:]]est parfois utilisé à la place de [[:blank:]]pour sa couverture du caractère de retour chariot erroné dans les fichiers texte Microsoft.

Vous ne pouvez pas remplacer par grep- c'est juste un outil de recherche. Au lieu de cela, pour remplacer le yespar, novous pouvez utiliser une commande comme celle-ci:

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

Cela indique sedde remplacer (changer) le mot yesen nosur n'importe quelle ligne qui contient le mot disable. (L' opérateur \>(initialement un ex/ viregexp), dans certaines sedimplémentations, force une fin de mot (bien que ce ne soit pas des mots délimités par des espaces , il correspondrait également disable-option)). Idéalement, cela évite complètement la question des espaces blancs.


Soyez prudent: avec une ligne telle que eyes yes, une yessubstitution illimitée s'appliquerait à la première instance de yeset vous laisserait eno yes. C'est pourquoi j'ai utilisé \<yes\>au lieu de juste yes.

roaima
la source
C'est bien expliqué mais ça ne marche pas pour moi.
Pozinux
1
@Pozinux Je n'ai pas vu que vous n'étiez disablepas au début d'une ligne. J'ai modifié mon RE en conséquence.
roaima
Toujours pas de changement désolé.
Pozinux
2
Vous avez raison, en fait - je peux reproduire cela. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'ne fonctionne pas non plus pour moi (sur MacOS, avec BSD sed). Le code original de l'OP fonctionne bien pour moi avec GNU sed (v4.4), cependant.
Charles Duffy
1
J'allais dire - fonctionne très bien pour moi avecdocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy
6

Pourquoi et comment puis-je savoir quels sont les éléments entre "désactiver" et "="? S'agit-il de plusieurs espaces? tabulations?

Onglets probablement. Vous pourriez utiliser quelque chose comme

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

à voir. Il affichera les tabulations comme \tet les espaces comme des espaces.

ilkkachu
la source
Je ne connaissais pas la commande od, très agréable! J'ai modifié ma question afin que vous puissiez voir le résultat de la commande od. Si je comprends bien, il n'y a pas d'onglets entre le "désactiver" et le "=", n'est-ce pas? Mais combien? Pouvons-nous les compter?
Pozinux
1
@Pozinux, donc pas d'onglet alors. Je ne vois aucune raison pour laquelle cela grepne devrait pas fonctionner en premier, désolé
ilkkachu
0

Essayez autre grep appelé SIFT de sift-tool.org - est grep sur steriods qui fait pattern matching regex intelligente

Brandon Haberfeld
la source
Comment cela fonctionnerait-il dans cette situation? Pouvez-vous donner un exemple?
roaima