2009-08-17 11 views
0

Frage zum Batch/Windows/CMD:Zeile in Textdatei suchen, nach Text dazwischen suchen?

Ich möchte, dass meine Batch-Datei nach einer Zeile suchen (was ich schon erreicht, aber was als nächstes nicht kommt), sieht es wie folgt aus:

<name>MyName</name> 

Es muss den Text zwischen <Name> und </Name > finden. Danach muss es als Variable festgelegt werden (% name%).

Hat jemand eine Idee?

EDIT: Wenn jemand eine Antwort geben möchte, bitte den Code auflisten. Perl ist in Ordnung, aber das sollte Open-Source sein und nicht jeder hat Perl.

+0

Wenn Sie Code-ähnlichen Text in Backticks (das ''' Zeichen) einschließen, können Sie anzeigen, was Sie wörtlich eingeben. Dies wird Verwirrung vermeiden - ich musste Ihre Frage ein paar Mal lesen, um herauszufinden, dass Sie Klammern für spitze Klammern ersetzt haben. –

Antwort

3

Es kann auf diese Weise durchgeführt werden (vorausgesetzt, Ihre Eingabe in der Datei "test1.html"):

findstr "<name>" test1.html > temp1.lis 
FOR /F "tokens=2 delims=>" %%i in (temp1.lis) do @echo %%i > temp2.lis 
FOR /F "tokens=1 delims=<" %%i in (temp2.lis) do @echo %%i > temp3.lis 

Die erste Linie eine Wache, die nur HTML/XML-Tag "namen" in passen auf die beiden FOR-Zeilen (du darfst das schon getan haben) . Das Ergebnis wird in einer temporären Datei "temp1.lis" gespeichert.

Die zweite Zeile erfassen, was rechts von der ersten ">" - in der Tat was nach "< Name>" ist. Zu diesem Zeitpunkt ist "MyName </name" in der temporären Datei "temp2.lis" (als das schließende Tag enthält auch ">"). Notieren Sie die doppelte "%" s (%% i), da dies in einer BAT-Datei ist (wenn Sie direkt von der Kommandozeile aus testen wollen, dann sollte es nur ein "%" sein).

Die dritte Zeile capture, was links von der erste ist "<" - Dies ist das gewünschte Ergebnis: "MyName" (wird in "MyName </name" von "<" links). Das Ergebnis liegt in der Variablen %% i und Sie können eine Funktion mit %% i als Parameter aufrufen und auf das Ergebnis in dieser Funktion zugreifen (in der Zeile FOR über der Funktion war das eingebaute "echo" und das Ergebnis so endete in temporärer Datei "temp3.lis" durch die Umleitung von Standard Ausgabe von bis)


Beachten Sie, dass die oben funktioniert nur, wenn

<name>MyName</name> 

der ersten HTML/XML-Tag in a Linie. Wenn das nicht der Fall ist oder Sie eine robustere Lösung wünschen, können Sie stattdessen eine Funktion in der ersten FOR-Zeile aufrufen (die empfängt %% i als ersten Parameter). Diese Funktion kann dann ersetzen "< Name>" mit einem einzelnen Zeichen, das Sie sind sicher ist nicht in der Eingabe, z.:

set RLINE=%MYLINE:<name>=£% 

Erläuterung: wenn die Eingabezeile in Variable% MYLINE% ist dann "< name>" mit "£" ersetzt werden und wird das Ergebnis variable% RLINE% zugewiesen.

Der Grund für die Ersetzung ist, dass die Trennzeichen für die FOR-Schleife nur ein einzelnes Zeichen sind.

Sie dann „£“ als Trennzeichen in der FOR-Schleife verwenden können (zu extrahieren, was rechts von ist „< name>“ - wie vorher):

echo %RLINE%>temp5.lis 
FOR /F "tokens=2 delims=£" %%i in (temp5.lis) do @echo %%i > temp6.lis 

Sie haben, dies zu wiederholen Technik für "</name>" (aber nur wenn < Name> MyName </Name> ist nicht der erste HTML/XML-Tag in einer Zeile).

So wie Sie sehen, ist es möglich, aber ist ziemlich schmerzhaft.

+0

Sie sagen, dass oben funktioniert nur, wenn die erste Zeile ist ... aber Sie findstr verwenden, so dass es in der Haltedoc Recht sucht? –

+0

Nein, nicht die erste Zeile. Das erste Tag in einer Zeile. Wenn eine Zeile " Unrelated content einige weitere Wörter MyName" enthielt, dann würde die relativ einfache erste Lösung nicht funktionieren. –

+0

Können Sie eine Beispieleingabe in Ihre Frage auflisten? –

0

Lernen Perl, es ist für genau so etwas gemacht.

+0

Jetzt haben Sie 2 Probleme. http://blogs.msdn.com/oldnewthing/archive/2006/03/22/558007.aspx – RossFabricant

+0

Nein, wirklich, Perl ist großartig für die Manipulation von Textdateien. Lassen Sie mich zu Ihrem Scherz hinzufügen: Wenn Sie einfach einen Computer benutzen, haben Sie zwei Probleme. Wenn Sie einen Browser öffnen und eine Frage zu SO eingeben, treten zwei Probleme auf. Wenn Sie nicht lernen wollen, wie man gute Werkzeuge benutzt, können Sie mit etwas Glück alles erreichen. – mcandre

+0

der Link, den du gibst, ist nur ein bisschen veraltet ... ich weiß, was du sagst, "es sind die Grundlagen" ... Aber wenn du mir ein Tutorial geben willst, gib mir bitte ein aktualisierteres, ok . Aber trotzdem danke. –