我一直在玩一个小的shell脚本,以便从使用lynx下载的HTML页面中获取一些信息。
我的问题是我收到了这个字符串:<span class="val3">MPPTN: 0.9384</span></td>
我可以使用以下方法修改其中的第一部分:
trimmed_info=`echo ${info/'<span class="val3">'/}`
字符串变为:“MPPTN:0.9384”
但我怎样才能修剪最后一部分?好像“/”似乎弄乱了echo命令......我试过了:
echo ${finalt/'</span></td>'/};
答案 0 :(得分:6)
不确定使用sed是否正常 - 提取数字的一种方法可能是......
echo '<span class="val3">MPPTN: 0.9384</span></td>' | sed 's/^[^:]*..//' | sed 's/<.*$//'
答案 1 :(得分:4)
${VARIABLE/PATTERN/REPLACEMENT}
的行为取决于您正在使用的shell,以及bash的版本。在ksh下,或者在最近足够(我认为≥4.0)版本的bash下,${finalt/'</span></td>'/}
根据需要剥离子字符串。在旧版本的bash中,引用相当古怪;你需要写${finalt/<\/span><\/td>/}
(它仍适用于较新的版本)。
由于您正在删除后缀,因此您可以使用${VARIABLE%PATTERN}
或${VARIABLE%%PATTERN}
结构。在这里,您将删除第一个</
之后的所有内容,即与模式</*
匹配的最长后缀。同样,您可以使用${VARIABLE##PATTERN}
删除主要HTML标记。
trimmed=${finalt%%</*}; trimmed=${trimmed##*>}
添加了优势:与${…/…/…}
不同,${…#…}
特定于bash / ksh / zsh,并且在所有三种情况下的工作方式略有不同,${…%…}
和echo "${finalt/'</span></td>'/}"
完全可移植。他们没有那么多,但在这里他们已经足够了。
附注:虽然在这个特定情况下它没有引起任何问题,但你应该总是在变量替换周围添加双引号,例如
{{1}}
否则shell将在结果中展开通配符和空格。简单的规则是,如果你没有充分的理由留下双引号,你就把它们放进去。
答案 2 :(得分:2)
解决方案在很大程度上取决于您想要做的完全。如果您的所有字符串都是<span class="val3">XXXXX: X.XXXX</span></td>
形式,那么最简单的解决方案是
echo $info | cut -c 20-32
如果它们的格式为<span class="val3">variable length</span></td>
,则最简单的解决方案是
echo $info | sed 's/<span class="val3">//' | sed 's/<\/span><\/td>//'
如果它更通用,你可以像在Sai的答案中那样使用正则表达式。
答案 3 :(得分:1)
我建议使用sed
命令来执行此类操作:
echo "$string" | sed "s/$regex/$replace/"