bash awk:打印两个匹配之间的行并删除其他两个匹配之间的换行符

问题描述 投票:0回答:1

这是我在 stack Overflow 上发表的第一篇文章,所以如果我做错了什么,请告诉我! 我已经为此搜索了几个小时,但找不到完整的解决方案。我可以选择其中之一,但不能同时获得两者。

我不想将一个 awk 命令通过管道传输到另一个命令。 相反,我想使用单行 awk 命令。

我有一个网页的curl输出,我想用awk(常规awk,无gawk,mawk等)更改它。 我想获取单词

Downstream Channel Status
之后和 </table> 出现
first
之前的所有行。 然后,在提到的匹配之间,应删除
<tr align='center'>
</tr>
之间的所有换行符。不需要打印具有上述匹配的行。但如果解决方案不能,我可以解决它

这是curl 的(缩短的)输出(保存在变量中)。

<html>
   <head>
   </head>
<body>
<blockquote>
<p>
<table border="1" cellpadding="4" cellspacing="0">
<tr><th colspan=3><b>Startup Procedure</b></th></tr>
</table><br>
</p>

<p>
   <table border='1' cellpadding='4' cellspacing='0'>
<tr><th colspan=13><b>Downstream Channel Status</b></th></tr>
   <tr align='center'>
      <td class='hd'>Channel Index</td>
      <td class='hd'>Channel ID</td>
   </tr>
   <tr align='center'>
      <td>1</td>
      <td>10</td>
   </tr>
   <tr align='center'>
      <td>2</td>
      <td>1</td>
   </tr>
   <tr align='center'>
      <td>3</td>
      <td>2</td>
   </tr>
   <tr align='center'>
      <td>4</td>
      <td>3</td>
   </tr>
</table><br><br>

</p>

<p>
   <table border='1' cellpadding='4' cellspacing='0'>
<tr><th colspan=9><b>Upstream Channel Status</b></th></tr>
   <tr align='center'>
      <td class='hd'>Channel Index</td>
      <td class='hd'>Channel ID</td>
   </tr>
   <tr align='center'>
      <td>1</td>
      <td>9</td>
   </tr>
   <tr align='center'>
      <td>2</td>
      <td>10</td>
   </tr>
   <tr align='center'>
      <td>3</td>
      <td>11</td>
   </tr>
</table><br><br>

</p>

</blockquote>
</body>
</html>

我几乎找到了解决方案,但后来我的电脑崩溃了,现在我的 bash 历史记录消失了。 但我尝试结合如何打印两个模式之间的行,包含或排除(在 sed、AWK 或 Perl 中)?删除两个模式之间所有出现的新行(sed 或 awk?)

最后我想以这几行结束:

<td class='hd'>Channel Index</td><td class='hd'>Channel ID</td>
<td>1</td><td>193</td>
<td>2</td><td>1</td>
<td>3</td><td>2</td>
<td>4</td><td>3</td>

如果您有适合我的解决方案,您能解释一下它是如何工作的吗?

谢谢!

bash awk pattern-matching line-breaks
1个回答
0
投票

这适用于您的输入。显然,

Downstream Channel Status
数量的任何变化都会破坏功能。

% awk '/<\/table>/ && set1 == 1{set1--} 
       /Downstream Channel Status/{set1++} 
       set1 == 1 && set2 > 0 && !/tr.*>/{sub(/ */,"",$0); printf("%s", $0)} 
       set1 == 1 && set2 > 0 && /<.tr>/{print ""} 
       /<tr align=.center.>/{set2++}' fhtml
<td class='hd'>Channel Index</td><td class='hd'>Channel ID</td>
<td>1</td><td>10</td>
<td>2</td><td>1</td>
<td>3</td><td>2</td>
<td>4</td><td>3</td>

数据

% cat fhtml
<html>
   <head>
   </head>
<body>
<blockquote>
<p>
<table border="1" cellpadding="4" cellspacing="0">
<tr><th colspan=3><b>Startup Procedure</b></th></tr>
</table><br>
</p>

<p>
   <table border='1' cellpadding='4' cellspacing='0'>
<tr><th colspan=13><b>Downstream Channel Status</b></th></tr>
   <tr align='center'>
      <td class='hd'>Channel Index</td>
      <td class='hd'>Channel ID</td>
   </tr>
   <tr align='center'>
      <td>1</td>
      <td>10</td>
   </tr>
   <tr align='center'>
      <td>2</td>
      <td>1</td>
   </tr>
   <tr align='center'>
      <td>3</td>
      <td>2</td>
   </tr>
   <tr align='center'>
      <td>4</td>
      <td>3</td>
   </tr>
</table><br><br>

</p>

<p>
   <table border='1' cellpadding='4' cellspacing='0'>
<tr><th colspan=9><b>Upstream Channel Status</b></th></tr>
   <tr align='center'>
      <td class='hd'>Channel Index</td>
      <td class='hd'>Channel ID</td>
   </tr>
   <tr align='center'>
      <td>1</td>
      <td>9</td>
   </tr>
   <tr align='center'>
      <td>2</td>
      <td>10</td>
   </tr>
   <tr align='center'>
      <td>3</td>
      <td>11</td>
   </tr>
</table><br><br>

</p>

</blockquote>
</body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.