Получение результатов grep / xargs на отдельных строках

У меня есть куча файлов. Я использую ключевое слово grep и передаю имена файлов, которые содержат это ключевое слово, в xmllint, который выполняет выражение XPath для возврата части различных файлов.

grep -irl "keyword" . | xargs xmllint --xpath '/HTML/BODY/P[2]' 

Проблема в том, что есть несколько файлов, которые имеют ключевое слово и, следовательно, несколько результатов для различных выполнений xmllint. Я хочу видеть результат каждого xpath в отдельной строке. Но все они объединены в одну линию.

Какие-нибудь советы?

2 ответа

Решение

Ты можешь использовать -n1 в xargs чтобы убедиться только file is passed toxargs` одновременно:

grep -irl "keyword" . | xargs -n 1 xmllint --xpath '/HTML/BODY/P[2]' 

Если вы хотите более точный контроль над выводом xargs затем используйте цикл while с подстановкой процесса:

while read -r file; do
    echo "Processing $file =>"
    xmllint --xpath '/HTML/BODY/P[2]' "$file
    echo "==========================="
done < <(grep -irl "keyword" .) 

Одним из быстрых решений является использование цикла for для этого:

for file in `grep irl "keyword" .`; do 
    xmllint --xpath '/HTML/BODY/P[2]' $file;
    echo;
done

---- РЕДАКТИРОВАТЬ ----

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

Другие вопросы по тегам