Как удалить подобный XML-тэщ¦м из входа?

Я обновляю мой .bashrc файл для показа погоды я использую строку

lynx -dump "http://wxdata.weather.com/wxdata/weather/local/14225?cc=*&unit=f&dayf=1" | grep -A 2 -m 1 "<tmp>"

Который дает мне вывод

    <tmp>48</tmp>
    <flik>46</flik>
    <t>Fair</t>

Я должен добавить | sed xxxxxx снимать все кроме текста, таким образом, это похоже на это

48
46
Fair

Я попытался читать на нем, но.. мое преимущество для вращения и я не могу найти никого или что-либо, что говорит, чтобы сделать это, необходимо использовать это.... Я только нахожу вещи как, "для удаления этого Вы помещаете 's/\.[^\.]*$//'"но они никогда не говорят, что его выполнение, таким образом, я не могу сказать.. хорошо... Я должен изменить это, к, которому, таким образом, это прокладывает себе путь, я хочу. Все, что я вижу, трусит царапина :D

Кто-то мог выяснить то, что я должен использовать для своей sed строки и, если возможно объяснять, как куриная царапина на самом деле разделяет то, что я должен разделить?

Если бы его слишком много explination, я был бы рад только за строку, что мог бы использовать и я буду использовать это в .bashrc таким образом, если можно иметь это в виду... Я заметил, что необходимо быть настоящие осторожный с использованием " and '

Это - строка, которую я изменяю, который больше не работает

weather ()
{
declare -a WEATHERARRAY
WEATHERARRAY=( `lynx -dump "http://www.google.com/search?hl=en&lr=&client=firefox-a&rls=org.mozilla_en-US_official&q=weather+{$1}&btnG=Search" | grep -A 5 -m 1 "Weather for" | sed 's;\[26\]Add to iGoogle\[27\]IMG;;g'`)
echo ${WEATHERARRAY[0]} ${WEATHERARRAY[1]} ${WEATHERARRAY[2]} ${WEATHERARRAY[3]}
echo -ne "Today:" ${WEATHERARRAY[4]} "-" ${WEATHERARRAY[9]} "\t" ${WEATHERARRAY[5]} "-" ${WEATHERARRAY[10]} "\t" ${WEATHERARRAY[6]} "\t" ${WEATHERARRAY[7]}

Я полагаю, что должен буду изменить его для сходства с этим

weather ()
{
declare -a WEATHERARRAY
WEATHERARRAY=( `lynx -dump "http://wxdata.weather.com/wxdata/weather/local/14225?cc=*&unit=f&dayf=1" | grep -A 2 -m 1 "<tmp>" | sed 'sed commands'`)
echo -ne "Today: ${WEATHERARRAY[2]} "-"  ${WEATHERARRAY[0]}"º" "Feels Like:" ${WEATHERARRAY[1]}"º" 

Любая справка значительно ценилась бы.

2
задан 9 May 2016 в 02:51

3 ответа

Я наконец получил его работающий как, я хочу. Я должен дать кредит и благодаря efthialex для его объяснений. Его решение не работало на мою ситуацию, но информацию, которую он дал, наверняка поможет мне в будущем.

Я также должен благодарить the_velour_fog. Он почти получил его прокладывание себе путь, которое я хотел.. мы были близки, и у него, вероятно, был бы он, если бы мы продолжали пробовать.

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

weather ()
{
declare -a WEATHERARRAY
mapfile -t WEATHERARRAY < <(lynx -dump "http://wxdata.weather.com/wxdata/weather/local/14225?cc=*&unit=f&dayf=1" | xmlstarlet sel -T -t -m "/weather/cc" -c "tmp" -n -c "flik" -n -c "t" -n) ;
echo -ne "Today:" ${WEATHERARRAY[2]} "-" ${WEATHERARRAY[0]}"º" "Feels Like:" ${WEATHERARRAY[1]}"º" 
}

Еще раз спасибо это - то, что Вы помогли мне создать:enter image description here

2
ответ дан 9 May 2016 в 12:51
  • 1
    Другая хорошая идея состоит в том, чтобы сказать Личинке автоматически загружать последний выбор пункта меню после тайм-аута. Таким образом, новейшее ядро isn' t автоматически выбранный и необходимо перезагрузить. Также хороший для автоматического Windows обновляют несколько перезагрузка. – WinEunuuchs2Unix 19 October 2017 в 06:26

Я только что записал и протестировал это, и это работает на меня, предполагая, что Ваш текст находится в названном файле: text_for_sed.txt

команда:

sed -n "/<tmp>\([[:digit:]]\{2\}\)<\/tmp>/{
    s/<tmp>\([[:digit:]]\{2\}\)<\/tmp>/\1/p
    n
    s/<flik>\([[:digit:]]\{2\}\)<\/flik>/\1/p
    n
    s/<t>\([[:alpha:]]\+\)<\/t>/\1/p
}" text_for_sed.txt

производит

48
46
Fair

, если бы grep производит вывод затем, Вы передали бы его по каналу в sed

<your grep command> | sed -n "/<tmp>\([[:digit:]]\{2\}\)<\/tmp>/{
    s/<tmp>\([[:digit:]]\{2\}\)<\/tmp>/\1/p
    n
    s/<flik>\([[:digit:]]\{2\}\)<\/flik>/\1/p
    n
    s/<t>\([[:alpha:]]\+\)<\/t>/\1/p
}"

, я знаю, что это сложно, смотря, я пытался думать о лучшем (более простом) пути - если бы Вы могли бы сделать это в нескольких передачах grep --only, было бы легче, но в одной передаче sed является единственным способом, которым я знаю, как сделать это.

0
ответ дан 9 May 2016 в 12:51
  • 1
    ничего себе, удивительный.. огромное спасибо это работает...... – Abhi balachandra 19 October 2017 в 17:01
#!/bin/bash 

data=$(lynx -dump "http://wxdata.weather.com/wxdata/weather/local/14225?cc=*&unit=f&dayf=1" | grep -A 2 -m 1 "<tmp>")

for pattern_to_find in tmp flik t
do
    echo $data | tr " " "\n" | sed -ne "/<$pattern_to_find>/s#\s*<[^>]*>\s*##gp"
done

Вывод

51
51
Mostly

Объяснение:

echo $data | tr " " "\n" | sed -ne '/<pattern_to_find>/s#\s*<[^>]*>\s*##gp'

tr " " "\n" - пробелы замен с \n

sed часть:

Элемент списка

n - подавите печать всех строк

e - сценарий

/<pattern_to_find>/ - находит строки, которые содержат указанный шаблон, что могло быть, например.<tmp>

затем часть замены s///p это удаляет все кроме требуемого значения где / заменяется # для лучшей удобочитаемости:

s#\s*<[^>]*>\s*##gp

\s* - включает пробелы, если существуют (то же в конце) <[^>]*> представляет <xml_tag> как нежадная regex альтернативная причина <.*?> не работает на sed g - замены все, например, закрывающийся xml </xml_tag> тег

Источник @vldbnc

2
ответ дан 9 May 2016 в 12:51
  • 1
    Я выполняю не Xubuntu, но вручную установил xfce на запасе Ubuntu. Вы предлагаете использовать xfce терминал вместо гнома? Я могу удалить терминал Gnome без каких-либо последствий? – Suncatcher 18 October 2017 в 22:46

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

Похожие вопросы: