我已经看到 grep 在很多答案中被抛来抛去,但从未全神贯注。
现在我正在尝试从 Internet 获取本地保存页面的 HTML 标记内的内容,但我遇到了困难。我可以使用 grep 来识别我想要的输出,但不可能将其分隔为可用。
这是我的 test.sh 文件内容:
a=$(awk '/<div class="power-bar-text">/,/<\/div>/' 'Acid Fast.html')
b=$(echo $a | grep -PzTo [0-9\.]+)
echo $a
echo $b
此终端输出结果:
test.sh: line 4: warning: command substitution: ignored null byte in input
<div class="power-bar-text"> 9 </div> <div class="power-bar-text"> 8 </div> <div class="power-bar-text"> 11.25 </div> <div class="power-bar-text"> 10 </div> <div class="power-bar-text"> 6 </div> <div class="power-bar-text"> 5 </div> <div class="power-bar-text"> 2 (1s) </div> <div class="power-bar-text"> 3 </div> <div class="power-bar-text"> 2.50 </div>
9811.2510652132.50
这是先前的迭代,具有更好的人类可读性:
$ awk '/<div class="power-bar-text">/,/<\/div>/' 'Acid Fast.html' | grep -Pzn -C1 [0-9\.]+ -
1: <div class="power-bar-text">
9
</div>
<div class="power-bar-text">
8
</div>
<div class="power-bar-text">
11.25
</div>
<div class="power-bar-text">
10
</div>
<div class="power-bar-text">
6
</div>
<div class="power-bar-text">
5
</div>
<div class="power-bar-text">
2 (1s)
</div>
<div class="power-bar-text">
3
</div>
<div class="power-bar-text">
2.50
</div>
我不知道如何在上面的代码框中设置着色,但终端确实为那里的每个数字和句点使用默认匹配字体颜色红色对其进行编码。
(如果类名恰好是“power.bar.text”,这可能行不通,因为句点会在那里匹配......所以任何关于确保任何句点都是数字的帮助?我想这可能适用于正则表达式[0-9]+\.?[0-9]*
。 )
但是回到使用 bash 代码的第一个代码块,它提供的最终输出是9811.2510652132.50
. 但我想要类似的东西9,8,11.25,10,6,5,2,1,3,2.50
如果我对 grep 进行编码,我将可以选择-d,
将分隔符设置为输出中的命令。不幸的是,当我尝试时,这个想法没有奏效。
我有一个可能有用的可怕想法是使用 -m 参数输出重复处理它,增加允许的匹配数,然后找到每个输出之间的新内容。再一次,这听起来很糟糕。(例如,我希望 -m1 得到 9,然后 -m2 得到 98,-m3 得到 9811.25,我将从 m1 的输出中“减去”m2 的输出为 8;m3 的输出从 m2 的输出中得到11.25.)
实际上刚刚尝试过,它不起作用,因为我猜 awk 使它成为单行,所以无论我将它限制为多少匹配,都会输出完整的字符串,因为9811.2510652132.50
它的整体是第一个也是唯一的匹配。
当然有更好的方法吗?