grep, проблема xml - PullRequest
       5

grep, проблема xml

0 голосов
/ 19 июня 2010
   @ubuntu:/tmp$ cat one.xml 
<?xml version="1.0" encoding="UTF-8"?>
    <e2frontendstatus> 
     <e2snrdb>
      12.10 dB
     </e2snrdb>
     <e2snr>
      75 %
     </e2snr>
     <e2ber>
      0
     </e2ber>
     <e2acg>
      99 %
     </e2acg>
    </e2frontendstatus>
   @ubuntu:/tmp$ sed -n -e 's/.*<e2ber>\([0-9][0-9]*\)<\/e2ber>.*/\1/p' one.xml 
   @ubuntu:/tmp$ 

Я хочу получить значение между. Но это не работает, что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 19 июня 2010

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

xmlstarlet sel -t -v "//e2ber" one.xml
1 голос
/ 19 июня 2010

Если у вас есть опция grep -A, упомянутая в ответе выше, и команда Unix tr в вашей системе, вы можете сделать что-то достаточно надежное.

Эта команда должна получить соответствующее значение:

grep -A2 '<e2ber>' one.xml | \
    tr -d '\n' | \
    sed -n -E -e 's/.*<e2ber>[[:blank:]]*([0-9][0-9]*)[[:blank:]]*<\/e2ber>.*/\1/p'

Это должно работать независимо от того, отформатирован ли файл XML как <e2ber>0</e2ber> или как

<e2ber>
    0
</e2ber>

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

Это может по-прежнему иметь проблемы, если XML-файл имеет двойной интервал -eg

<e2ber>

0

</e2ber>

Вы можете обойтиэто путем запуска файла XML через tr -s '\n' заранее.Это сожмет несколько новых строк в одну новую строку.

1 голос
/ 19 июня 2010

Какую ценность вы ищете?Знаете ли вы, что grep в Linux имеет параметры командной строки «После контекста» и «До контекста»?Это может быть самый простой способ получения информации, которую вы ищете.

Например, если вы пытаетесь получить значение после строки, вы можете сделать что-то вроде этого:

$ grep -A1 "<e2ber>" | tail -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...