Я обновляю мой .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]}"º"
Любая справка значительно ценилась бы.
Я наконец получил его работающий как, я хочу. Я должен дать кредит и благодаря 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]}"º"
}
Я только что записал и протестировал это, и это работает на меня, предполагая, что Ваш текст находится в названном файле: 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 является единственным способом, которым я знаю, как сделать это.
#!/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>
тег