我正在更新我的.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>
标签