Warum kann ich auf diese Weise nicht greppen?

Warum kann ich auf diese Weise nicht greppen?

Ich möchte in folgender Datei die Zeile "disable = yes" in "disable = no" ändern:

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

Ich habe Folgendes versucht:

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

indem ich den Bereich einfach mit der Maus kopiere, aber es wird nichts erfasst ...

Warum und wie kann ich wissen, welche Elemente zwischen „disable“ und „=“ stehen? Sind es mehrere Leerzeichen? Tabellierungen?

Ich weiß, dass ich mit dem folgenden regulären Ausdruck greppen kann:

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

Und schließlich: Gibt es eine bessere Möglichkeit, mit sed „yes“ durch „no“ zu ersetzen, als die folgende:

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

BEARBEITEN :

Ergebnis des od-Befehls, danke @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

Antwort1

Die Leerzeichen sind allgemein als „Whitespace“ bekannt und können nicht nur Leerzeichen, sondern auch Tabulatoren (und andere „leere“ Zeichen) umfassen. In einem regulären Ausdruck können Sie diese häufig entweder mit [[:space:]]oder \s(je nach RE-Engine) bezeichnen, was beides umfasst.horizontal(Leerzeichen, Tabulator und einige Unicode-Abstandszeichen verschiedener Breite, falls verfügbar), für die Sie auch [[:blank:]]und manchmal und \hverwenden könnenVertikaleLeerzeichen (wie Zeilenvorschub, Seitenvorschub, vertikaler Tabulator oder Wagenrücklauf). [[:space:]]wird manchmal anstelle von verwendet, [[:blank:]]um das falsche Wagenrücklaufzeichen in Microsoft-Textdateien abzudecken.

Sie können „durch“ nicht ersetzen grep– es ist nur ein Suchwerkzeug. Um „ yesdurch“ zu ersetzen, nokönnen Sie stattdessen einen Befehl wie diesen verwenden:

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

Dies weist an, das Wort in jeder Zeile, die das Wort enthält, seddurch zu ersetzen (zu ändern) . (Der (anfänglich ein / Regexp-Operator) erzwingt in einigen Implementierungen ein Wortende (aber Vorsicht, es ist nichtyesnodisable\>exvisedDurch Leerzeichen getrennte Wörter, es würde auch mit )) übereinstimmen disable-option. Praktischerweise wird dadurch das Problem mit Leerzeichen vollständig umgangen.


Seien Sie vorsichtig: Bei einer Zeile wie würde eyes yeseine unbegrenzte yesErsetzung auf die erste Instanz von angewendet yesund Sie hätten eno yes. Aus diesem Grund habe ich \<yes\>statt nur verwendet yes.

Antwort2

Warum und wie kann ich wissen, welche Elemente zwischen „disable“ und „=“ stehen? Sind es mehrere Leerzeichen? Tabellierungen?

Wahrscheinlich Tabs. Sie könnten etwas wie

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

zu sehen. Tabulatoren werden als \tund Leerzeichen als Leerzeichen angezeigt.

Antwort3

Versuchen Sie die Grep-Alternative namenssiebenaussift-tool.org- ist grep auf Steroiden, das intelligentes Regex-Mustervergleich durchführt

verwandte Informationen