【问题标题】:sed or awk insert blank line between two known lines [closed]sed 或 awk 在两个已知行之间插入空白行 [关闭]
【发布时间】:2022-08-15 04:51:23
【问题描述】:

我必须用 sed 或 awk 分隔以下文本:

输入样本:

<td class=\"ris\">
</td>

输出样本:

<td class=\"ris\">

</td>

我也有这种不应该用空行分隔的文本。如果下一行以&lt;/td&gt; 开头,我只需要一个空行。以下不应分开。

<td class=\"ris\">
<span class=\"delayOnTime bold\">08:39</span></span>,<br/><span 
class=\"red\">Grund: Versp&#228;tung aus vorheriger Fahrt</span></td>

你有什么主意吗?

  • 欢迎来到 SO。请在您的问题中添加 3 个重要的内容。第一个:输入样本,第二个:输出样本,第三个:您尝试过的代码作为您的努力。请使用这些详细信息编辑您的问题,然后让我们知道,谢谢(不是我的反对票)。

标签: regex linux bash awk sed


【解决方案1】:

这可能对您有用(GNU sed):

sed -E 'N;s#(<td class="ris">)(\n</td>)#\1\n\2#;P;D' file

如果匹配,则追加下一行并在它们之间插入新行。

打印/删除第一行并重复。

【讨论】:

    【解决方案2】:

    sed 单线是:

    sed -e '/td class="ris"/ { n; /^<\/td>.*$/ { s/^.*$/\n&/ }}'
    

    为了解释解决方案,让我们把它写成一个脚本:

    #!/bin/sed -f
    /td class="ris"/ {  # For every td of "ris" class,
      n                 # read the next line.
      /^<\/td>.*$/ {    # If the next line starts with the closing td,
        s/^.*$/\n&/     # insert one \n before it
      }
    }
    

    请注意,我们处于常规 sed 模式,这意味着一旦我们阅读下一行,就会打印模式空间。 这使解决方案变得简单,无需使用保持空间,sed 将为我们完成。

    【讨论】:

    • 这可行,但我在我的问题中添加了另一个条件。你也能帮帮我吗?
    • 完毕。并将其更改为完整的脚本形式。
    • 我需要它以 bash 格式进行测试
    • 该问题要求 sed/awk 解决方案。也许您不想保存脚本,所以我添加了一个如何直接运行它的示例。还是您真的需要纯 bash 的解决方案?这是可行的,但问题要求在标准过滤工具之一中找到解决方案。
    • 你能连续写第二个给我吗?
    【解决方案3】:

    我会按照以下方式利用 GNU AWK 来完成这项任务,让 file.txt 内容成为

    <td class="ris">
    </td>
    

    然后

    awk 'prev=="<td class=\"ris\">" && $0=="</td>"{print ""}{print;prev=$0}' file.txt
    

    给出输出

    <td class="ris">
    
    </td>
    

    说明:我将上一行存储在变量 prev 中,观察 $0 的赋值是对每一行执行的最后一个操作。如果上一行是&lt;td class="ris"&gt;" 需要转义以表示文字")并且当前行($0)是&lt;/td&gt; I print 空字符串,即添加空行,每一行都是@987654332按原样@ed。如果同时应用了这两个操作,则空字符串首先是printed,以便出现在&lt;/td&gt; 之前。

    (在 gawk 4.2.1 中测试)

    【讨论】:

    • 这有效,但它删除了我 <td class="ris"> 和 </td> 之间的行
    • 当 <td class="ris"> 之后的下一行是 </td> 时,我只需要空行。如果出现其他内容,则不应插入空行
    • @Jan 这是由代码中的拼写错误引起的,我修复了它
    【解决方案4】:

    也许试试这个(这是gawk 特定的):

    gawk -be 'BEGIN { FS = "<td class=\"ris\">" 
    
           RS=ORS=(_="\n")"</td>"_ } sub("$", NF<=(RT<RS) ?__:_)^+(ORS=RT)'      
    
    <td class="ris">
    <span class="delayOnTime bold">08:39</span></span>,<br/><span 
    class="red">Grund: Versp&#228;tung aus vorheriger Fahrt</span>
    </td>
    <td class="ris">
    
    </td>
    <td class="ris">
    <span class="delayOnTime bold">08:39</span></span>,<br/><span
    class="red">Grund: Versp&#228;tung aus vorheriger Fahrt</span>
    </td>
    

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多