Wie kann man ein bestimmtes Wort in einer Datei ausgeben, wenn es vorhanden ist?

410
monster

Ich mache ein einfaches Skript, an das ich mich wende true, falsewenn truees in der Datei vorhanden ist oder umgekehrt, wenn falsees in der Datei vorhanden ist, Details hier . Jetzt i ausgegeben werden soll, was ist der Wert nach der Änderung, dh wenn ich geändert, falseum truees ausgeben soll true. Im Moment verwende ich zwei Aussagen -

grep "<active>false" settings.xml

grep "<active>true" settings.xml

Aber es wird <active>mit der Ausgabe gedruckt (wie erwartet), aber gibt es einen besseren Weg, dies zu tun?

Randbemerkung - Ich verwende <active>truein, grepweil mein Regex von Typ ist<active>([a-z]*)</active>

0
Entfernen Sie den Überschuss durch Filtern der Ausgabe mit sed: `grep"false "settings.xml | sed -e 's /// '` xenoid vor 5 Jahren 1
Ist es eine XML-Datei? uzsolt vor 5 Jahren 0
Ja, es ist eine XML-Datei monster vor 5 Jahren 0
In diesem Fall sollten Sie ein beliebiges XML-Tool verwenden, da sed / grep / .. zeilenorientiert ist. Beispiel: xmllint, xmlstarlet (http://xmlsoft.org/xmllint.html oder http://xmlstar.sourceforge.net/ ). Wer garantiert das?`und` true` stehen in derselben Zeile? uzsolt vor 5 Jahren 3

1 Antwort auf die Frage

1
slhck

Wenn Sie GNU verwenden grep, können Sie reguläre Perl-Ausdrücke mit einer positiven Lookbehind-Assertion verwenden:

grep -Po "(?<=<active>)(false|true)" settings.xml 

Dies wird nur falseoder ausgeben true. <active>wird abgeglichen, wenn auf trueoder gefolgt wird false, es wird jedoch nicht in die Ausgabe aufgenommen.

Im Idealfall sollten Sie jedoch einen XML-basierten Parser verwenden, wie in dem Kommentar von uzsolt vorgeschlagen .