grep текст между множеством тегов - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь получить текст между множеством тегов, как я могу получить текст, используя grep? Возврат локона:

<member><name>blogName</name><value><string>Secret Labs - NTB4WORLD</string></value></member>

Я уже пробую:

grep -Po '(?<=<member><name>blogName</name><value><string>)[^"]*'

но оно возвращается:

Secret Labs - NTB4WORLD</string></value></member>

как, если мне нужен результат, просто

Секретные лаборатории - NTB4WORLD

Ответы [ 3 ]

2 голосов
/ 12 апреля 2019
xmllint --xpath "string(//string)" your_file
0 голосов
/ 12 апреля 2019

Я протестировал это в командной строке, вы можете попробовать этот метод, если текст такой же, как всегда, этот метод включает в себя команды sed и awk, сначала я устанавливаю пробелы, а затем читаю и распечатываю значение с помощью awk

echo "<member><name>blogName</name><value><string>Secret Labs - NTB4WORLD</string></value></member>" | sed 's/\(\b[<||>]\)/\1\ /g' | awk '{for (I=1;I<=NF;I++) if ($I == "<string>") {print $(I+1)" " $(I+2) " " $(I+3) " " $(I+4) };}' | sed s'/[<]$//'
0 голосов
/ 12 апреля 2019

В соответствии с предложением используйте синтаксический анализатор XML. Если вы все еще хотите использовать grep, попробуйте:

grep -oP "<string>\K.+?(?=</string>)" file.xml

или если вы используете *BSD/macOS, попробуйте pcregrep

pcregrep -o "<string>\K.+?(?=</string>)" file.xml

\K может быть прочитано как исключающее все, что находится слева перед ним, и возвращает только правую часть .+?(?=</string>), пока не будет найден </string>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...