2017-01-31 2 views
0

Bitte helfen Sie mir bei der Verwendung von SED, AWK oder GREP, um den folgenden Text zu extrahieren. Ich habe Dateien, die ähnlich aussehen.Wie verwende ich grep, awk oder sed, um Text zwischen zwei Strings zu extrahieren?

Text text text text text text text 
Text text text text text text text 
    Table A 
<TABLE> 
xxx xxx xxx xxx 
xxx xxx xxx xxx 
</TABLE> 
Text text text text text text text 
Text text text text text text text 
    Table B 
<TABLE> 
xxx xxx xxx xxx 
xxx xxx xxx xxx 
</TABLE> 

Ich brauche alle Informationen nur für Tabelle A, bin mir aber nicht sicher, wie ich vorgehen soll.

+1

was id das Unterscheidungsteil 'Tabelle A', was den tatsächlichen Inhalt ist? – RomanPerekhrest

+1

Ersetzen Sie alle Text-, Text- und Textplatzhalter durch tatsächlichen, wirklich repräsentativen Beispieltext. Fügen Sie die erwartete Ausgabe für diese Eingabe hinzu. –

Antwort

1

Beides kann tun können, was Sie wollen, je nachdem, was Ihre erwartete Ausgabe und der Rest des Textes wie folgt aussieht:

$ awk '/Table A/{f=1} f{print; if (/<\/TABLE>/) exit}' file 
    Table A 
<TABLE> 
xxx xxx xxx xxx 
xxx xxx xxx xxx 
</TABLE> 

$ awk 'f{print; if (/<\/TABLE>/) exit} /Table A/{f=1}' file 
<TABLE> 
xxx xxx xxx xxx 
xxx xxx xxx xxx 
</TABLE> 
0

Solange kein </TABLE > im Element TABLE vorhanden ist.

sed -n '/Table A/,/<\/TABLE>/p' | grep -v "Table A" 

PS: die grep -v ist wahrscheinlich nicht notwendig ich nicht nur die Spitze von meinem Kopf der Option weiß aus nicht das Startmuster umfasst.

Die

<TABLE> 
    xxx xxx xxx xxx 
    xxx xxx xxx xxx 
</TABLE> 

drucken, wenn Sie den Text Teil müssen dies nicht funktionieren. AWK wäre wahrscheinlich besser.

Wenn Sie etwas mit einem Variablennamen müssen Sie

myTableName="Table A" 
sed -n "/${myTableName}/,/<\/TABLE>/p" | grep -v ${myTableName} 
+0

Tun Sie das nicht. Bereiche machen triviale Aufgaben sehr geringfügig kürzer, erfordern aber doppelte Bedingungen (wie oben gezeigt) oder vollständige Umschreibungen bei kleinsten Anforderungen. Verwenden Sie einfach eine Flagge anstelle eines Bereichs (was bedeutet, dass Sie awk, nicht sed und/oder grep verwenden sollten). –

0

Sie können sogar grep dafür, aber awk scheint besser.

grep -A1000 "Table A" file.txt | grep -B1000 "Table B"

Verwandte Themen