我有一个我已经卷曲的网页,我选择了一个标记语言样本,其中$num
行大($num
略高于估计值):
grep -A $num markerA
...然后通过管道输入:#/ p>来收紧该样本以获得良好的数据解析器
grep -B $num markerB
让我们假装页面如下:
~~~~~~~~~~~~~~
data
markerA
DATA
DATA
DATA
~~~~~~~~~~~~~~
DATA
DATA
markerB
我想要的数据是大写的。这似乎工作得很好,我在使用Perl表或Perl html :: parser在这个交汇点工作时很不公平。
我的问题出现在网页向其中抛出一些额外的数据时,我的$num
的计算会被关闭,所以我很好奇,如果页面看起来有点像:
~~~~~~~~~~~~~~
data
markerA
DATA
DATA
DATA
~~~~~~~~~~~~~~
DATA
DATA
markerC
data
data
~~~~~~~~~~~~~~
data
markerB
我如何说出grep表达式首先查找markerC
,如果它存在,则解析前面的行数,但如果它不存在则查找markerB
,而不是查找两者它们。
我更确定&&
或||
的某些表达是我正在寻找的,但说实话,这是对我的下一级bash理解。
编辑:看来markerA在输出中多次出现...也在标记C之后和markerB之前出现
答案 0 :(得分:0)
看起来您可能使用了错误的工具 - sed
使其变得非常简单。
sed -n '/markerA/,/marker[BC]/p'
如果您必须使用grep
,那么:
grep -A $num markerA file | grep -B $num 'marker[BC]'
应该做的伎俩。如果替代方案不那么简单,那么(使用GNU sed
):
sed -n -r '/markerA/,/markerB|Ctag/p'
或使用GNU grep
:
grep -A $num markerA file | grep -B $num -E 'markerB|Ctag'