Warum kann ich nicht so greifen?

8

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

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

Ich habe es versucht:

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

indem ich nur das Leerzeichen mit meiner Maus kopiere, aber es greift nichts ...

Warum und wie kann ich wissen, welche Elemente zwischen "deaktivieren" und "=" liegen? Sind es mehrere Leerzeichen? Tabellen?

Ich weiß, dass ich mit dem folgenden regulären Ausdruck grep 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, "Ja" durch "Nein" mit sed zu ersetzen als die folgenden:

[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:

Ergebnis des Befehls od 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
Pozinux
quelle

Antworten:

12

Die Leerzeichen werden allgemein als "Leerzeichen" bezeichnet und können nicht nur Leerzeichen, sondern auch Tabulatoren (und andere "Leerzeichen") enthalten. In einem regulären Ausdruck kann man oft auf diese beziehen sich entweder mit [[:space:]]oder \s(abhängig von der RE - Motor) , die beide enthält horizontal (Leerzeichen, Tabulatoren und einige Unicode Abstand Zeichen verschiedener Breite falls vorhanden) , für die Sie auch verwenden können , [[:blank:]]und manchmal \hund vertikalen Abstand Zeichen (wie Zeilenvorschub, Formularvorschub, vertikale Registerkarte oder Wagenrücklauf). [[:space:]]wird manchmal anstelle von verwendet, [[:blank:]]um das falsche Wagenrücklaufzeichen in Microsoft-Textdateien abzudecken.

Sie können nicht durch ersetzen grep- es ist nur ein Suchwerkzeug. Um das yesdurch zu ersetzen no, können Sie stattdessen einen Befehl wie den folgenden verwenden:

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

Dies weist sedan, das Wort yesin einer nobeliebigen Zeile, die das Wort enthält , zu ersetzen (zu ändern) disable. (Der \>(anfangs ein ex/ viregexp-Operator) erzwingt in einigen sedImplementierungen ein Wortende (obwohl Vorsicht geboten ist, dass es sich nicht um durch Leerzeichen getrennte Wörter handelt , würde es auch mit übereinstimmen disable-option)). Praktischerweise umgeht dies das Problem der Leerzeichen insgesamt.


Seien Sie vorsichtig: Bei einer Zeile wie z. B. würde eyes yeseine unbegrenzte yesSubstitution für die erste Instanz von gelten yesund Sie belassen eno yes. Deshalb habe ich \<yes\>statt nur verwendet yes.

Roaima
quelle
Es ist gut erklärt, funktioniert aber bei mir nicht.
Pozinux
1
@Pozinux Ich habe nicht gesehen, dass Sie disablenicht am Anfang einer Zeile standen. Ich habe meinen RE entsprechend geändert.
Roaima
Immer noch keine Änderung, sorry.
Pozinux
2
Sie haben tatsächlich Recht - das kann ich reproduzieren. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'funktioniert auch bei mir nicht (unter MacOS mit BSD sed). Der ursprüngliche Code des OP funktioniert jedoch gut mit GNU sed (v4.4).
Charles Duffy
1
Wollte sagen - funktioniert gut für mich mitdocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy
6

Warum und wie kann ich wissen, welche Elemente zwischen "deaktivieren" und "=" liegen? Sind es mehrere Leerzeichen? Tabellen?

Wahrscheinlich Tabs. Sie könnten so etwas wie gebrauchen

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

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

ilkkachu
quelle
Ich wusste nichts über od command, sehr nett! Ich habe meine Frage so bearbeitet, dass Sie das Ergebnis des Befehls od sehen können. Wenn ich das verstehe, gibt es keine Tabulatoren zwischen "Deaktivieren" und "=". Ist das richtig? Aber wie viele? Können wir sie zählen?
Pozinux
1
@Pozinux, also keine Tabs dann. Ich kann keinen Grund sehen, warum das zuerst grepnicht funktionieren sollte, sorry
ilkkachu
0

Probieren Sie die grep-Alternative sift von sift-tool.org aus - ist grep für Sterioden, die einen intelligenten Regex-Mustervergleich durchführen

Brandon Haberfeld
quelle
Wie würde das in dieser Situation funktionieren? Kannst du ein Beispiel geben?
Roaima