
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 \h
verwenden 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 „ yes
durch“ zu ersetzen, no
kö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, sed
durch zu ersetzen (zu ändern) . (Der (anfänglich ein / Regexp-Operator) erzwingt in einigen Implementierungen ein Wortende (aber Vorsicht, es ist nichtyes
no
disable
\>
ex
vi
sed
Durch 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 yes
eine unbegrenzte yes
Ersetzung auf die erste Instanz von angewendet yes
und 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 \t
und Leerzeichen als Leerzeichen angezeigt.
Antwort3
Versuchen Sie die Grep-Alternative namenssiebenaussift-tool.org- ist grep auf Steroiden, das intelligentes Regex-Mustervergleich durchführt