2016-08-08 67 views
-2

`Ich habe den Inhalt der Datei wie folgt.grep Befehl mit zwei Suchkriterien

<path 
action="A" 
kind="file">/Demo/svn_dev/src/classes/Util - Copy.cls</path><path 
action="D" 
kind="file">/Demo/svn_dev/src/classes/Admin.cls</path> 
<path action="M" 
kind="file">/Demo/svn_dev/src/classes/AdminUtilCtrl.cls</path> 
</paths> 
<msg>xyz</msg> 

Ich brauche den Pfad der Datei retrive wenn Meldungs-String "xyz" und action = "D" Hier enthält Ich brauche die raus setzen, wie/Demo/svn_dev/src/classes/Admin. cls Kann mir jemand mit grep Befehlssyntax helfen. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Danke für Ihre Hilfe

+2

Verstand zeigt hier etwas Mühe? – sjsam

Antwort

2

Sie können diesen Job nicht mit grep erledigen. Hier ist eine Möglichkeit, es mit GNU awk für Multi-char RS und dem 3. arg für Spiel zu tun():

$ cat tst.awk 
BEGIN { RS="\\s*</[^>]+>\\s*" } 
match($0,/^<path\s*action="D"[^>]+>(.*)/,a) { act = a[1] } 
/^<msg>xyz$/ { print act } 

$ awk -f tst.awk file 
/Demo/svn_dev/src/classes/Admin.cls 
0

mit grep können Sie auf Existenz des ersten Musters konditionieren die zweite zu extrahieren, müssen ein wenig nach der Arbeit, um die Informationen

$ grep -q '<msg>xyz</msg>' file && grep -A1 'action="D"' file | 
    sed -n -r '$s/[^>]*>(.*)<.*/\1/p' 

/Demo/svn_dev/src/classes/Admin.cls 

zu extrahieren, aber alle möglicherweise fehlschlagen, wenn Ihre Zeilenumbrüche unterscheiden sich von dem veröffentlichten Text. Vielleicht besser, xml-aware-tools zu verwenden.