2016-08-08 2 views
-2

`У меня есть содержимое файла, как показано ниже.Команда grep с двумя критериями поиска

<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> 

Мне нужно retrive путь к файлу, если сообщение содержит строку «XYZ» и действие = «D» Здесь мне нужно получить из положить в/Demo/svn_dev/SRC/классов/Admin. cls Может ли кто-нибудь помочь мне с синтаксисом команды grep. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо за вашу помощь

+2

Ум демонстрирует некоторое усилие здесь? – sjsam

ответ

2

Вы не можете выполнить эту работу с помощью grep. Вот один из способов сделать это с GNU AWK для мульти символьных RS и 3 арг для матча():

$ 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

с grep вы можете условие о существовании первого шаблона для извлечения второго, нужно немного после работы по извлечению информации

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

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

однако все может потерпеть неудачу, если разрывы строк отличаются от опубликованного текста. Возможно, лучше использовать инструменты, поддерживающие xml.

Смежные вопросы