2010-06-18 2 views
0
@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$ 

Я хочу получить значение betwen. Но это не работает, что я делаю неправильно?grep, xml problem

+0

Это не работает, потому что у вас есть новые строки ... это будет выполнимо с sed или awk, я уверен, но, вероятно, будет более счастливым в perl ... у вас есть это доступное? – Cascabel

+0

Проблема в том, что sed применяет регулярные выражения к одной строке за раз. Поскольку и находятся на разных линиях, они не соответствуют выражению. Можете ли вы изменить формат файла на что-то вроде ? Тогда вы сможете легче идентифицировать линию. –

+0

Другой вопрос, который мы должны задать, - это ваше точное требование. Я понимаю, что у вас ограниченные ресурсы, поэтому вы не собираетесь полностью разбирать XML, поэтому ваша надежность будет ограничена. Надеюсь, вы можете хотя бы считать, что файл XML не делает ничего сумасшедшего. – Cascabel

ответ

1

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

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

$ grep -A1 "<e2ber>" | tail -1 
+0

Простой, и работает как шарм !! Большое спасибо! – Peter

2

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

xmlstarlet sel -t -v "//e2ber" one.xml 
+1

Благодарим вас за ответ, но я запустил эту небольшую команду на встроенной системе (спутниковый ресивер), где невозможно запустить xmlstarlet (это очень хороший инструмент): /. Доступна другая команда linux, grep, sed .. – Peter

+0

У вас есть xmllint? – reinierpost

+0

reinerpost: Nothing: | – Peter

1

Если у вас есть 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-файл имеет двойное разнесение - например,

<e2ber> 

0 

</e2ber> 

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