【问题标题】:Unterminated address regex - misapplying escape characters in bash sed script?未终止的地址正则表达式 - 在 bash sed 脚本中误用转义字符?
【发布时间】:2017-03-13 22:09:15
【问题描述】:

刚刚学习 sed,我感觉自己离做我想做的事情越来越近了,只是遗漏了一些明显的东西。

目标是在一个 html 表中获取一堆 <tr>...</tr>s 并将其附加到另一个页面中的单个表中。所以我想获取初始文件,在我第一次使用<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

很确定这很简单,只是把表达搞砸了。谁能直截了当?

【问题讨论】:

    标签: bash sed escaping


    【解决方案1】:

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

    1. sed -n '\:&lt;table&gt;:,\:&lt;/table&gt;:p' ${input} | sed -n '\:&lt;tr&gt;:p'

    此行将删除块中所有包含&lt;tr&gt; 的行,范围从匹配&lt;table&gt; 的第一行到匹配&lt;/table&gt; 的第一行。所有这些新切割的线都打印在标准输出中。

    1. sed -i '\:</tbody>: { r /dev/stdin a </tbody> d}' ${inserttarget}

    这个多行命令将添加从stdin 读取的行匹配&lt;/tbody&gt; 的行之后。然后我们通过将&lt;/tbody&gt; 附加到新行之后 并删除旧行来移动&lt;/tbody&gt;

    这里使用的另一个技巧是将默认的正则表达式分隔符 / 替换为 :,以便我们可以在匹配模式中使用“/”。

    最终解决方案

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

    瞧!

    【讨论】:

    • 感谢更新;现在是sed: can't read /\&lt;tbody\&gt;/,/\&lt;\/tbody\&gt;/p: No such file or directory(伙计,sed 命令对于外行来说非常难以解析。)
    • 命令“有效”,但 inputtarget.html 最终成为一个空文件。没有错误,但也没有输出。 :)
    • 你需要复制所有四行并将它们粘贴到你的shell中,因为r命令必须单独在线,我认为a也需要它。
    • 嗯。我将 ${inserttarget} 输出到标准输入,但实际上并未编辑。不得不再戳一下。感谢您的帮助。
    • 我忘了把-i放回去,现在它也应该编辑你的文件了!很抱歉!
    猜你喜欢
    • 2021-04-22
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多