如何从输入中删除类似 XML 的标签?

如何从输入中删除类似 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 行中使用什么吗?如果可能的话,解释一下鸡毛蒜皮的事实际上是如何剥离我需要剥离的东西的?

如果解释太多,我会很高兴,只要我能用到这条线,我会用到这条线,.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]}"º" 

任何帮助将不胜感激。

答案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 是我所知道的唯一方法。

答案2

我终于让它按我想要的方式工作了。我必须感谢 efthialex 的解释。他的解决方案不适合我的情况,但他提供的信息肯定会在未来帮助我。

我还要感谢 the_velour_fog。他几乎按照我想要的方式完成了工作……我们很接近成功了,如果我们继续努力,他可能就会成功。

实际答案来自steeldriver 他能够想出最好的解决方案,现在它完全按照我想要的方式工作。我会将他的答案标记为正确,但是……哈哈,他是唯一一个在评论中发布帮助的人,而这最终成为最佳解决方案。最终的解决方案和代码更改如下

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]}"º" 
}

再次感谢这是你帮助我创造的:在此处输入图片描述

答案3

#!/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>为非贪婪正则表达式替代原因<.*?>不适用于 sed g- 替换所有内容,例如关闭 xml</xml_tag>标签

来源 @vldbnc

相关内容