未终止的地址正则表达式 - 在bash sed脚本中误用转义字符?

时间:2017-03-13 22:09:15

标签: bash sed escaping

刚学习sed,我觉得我已经接近做我想做的事情,只是错过了一些明显的东西。

目标是在html表中加入一堆<tr>...</tr>并将其附加到另一页中的单个表中。所以我想获取初始文件,在我第一次使用<tr>以及</table>下的所有内容时将所有内容都删除,然后将其插入另一个文件中</table>的正上方。如下所示,除了<tr></tr>之外,如果重要的话,除了Input File: Target File: <html><body> <html><body> <p>Whatever...</p> <p>Other whatever...</p> <table> <table> <tr><td>4</td></tr> <thead> <tr><td>5</td></tr> <tr><th>#</th></tr> <tr><td>6</td></tr> </thead> </table> <tbody> </body></html> <tr><td>1</td></tr> <tr><td>2</td></tr> <tr><td>3</td></tr> </tbody> </table> </body></html> Input file Target File: doesn't matter. <html><body> <p>Other whatever...</p> <table> <thead> <tr><th>#</th></tr> </thead> <tbody> <tr><td>1</td></tr> <tr><td>2</td></tr> <tr><td>3</td></tr> <tr><td>4</td></tr> <tr><td>5</td></tr> <tr><td>6</td></tr> </tbody> </table> </body></html> 之外。

#!/bin/bash
#$1 is the first parameter and $2 is the second parameter being passed when calling the script. The variable filename will be used to refer to this.

input=$1
inserttarget=$2

sed -e '/\<\/thead\>,$input' $input
sed -e '/\<\/table\>,$input' $input
sed -n -i -e '\<\/tbody\>/r' $inserttarget -e 1x -e '2,${x;p}' -e '${x;p}' $input

变为:

cars,ford,carsforsale

这是我正在尝试使用的代码:

ford

非常确定这很简单,只是弄乱了表达。谁能让我直截了当?

1 个答案:

答案 0 :(得分:0)

这里我将问题分为两个:  1.从输入中剪切行  2.将这些行粘贴到输出文件

  1. sed -n '\:<table>:,\:</table>:p' ${input} | sed -n '\:<tr>:p'
  2. 此行将删除块中包含<tr>的所有行,范围从匹配<table>的第一行到匹配</table>的第一行。所有这些新切割的线都打印在标准输出中。

    1. sed -i '\:</tbody>: { r /dev/stdin a </tbody> d}' ${inserttarget}
    2. 此多行命令将在匹配stdin的行之后添加从</tbody> 读取的行。然后,我们通过在新行后添加并移除旧行来移动</tbody>

      此处使用的另一个技巧是用/替换默认的正则表达式分隔符:,这样我们就可以在匹配模式中使用'/'。

      最终sotuion

      sed -i '\:</tbody>: {
      r /dev/stdin
      a </tbody>
      d}' ${inserttarget} < <(sed -n '\:<table>:,\:</table>:p' ${input} | sed -n '\:<tr>:p')
      

      Et瞧!