【问题标题】:Combining sed commands in bash在 bash 中组合 sed 命令
【发布时间】:2021-04-26 22:01:47
【问题描述】:

我的目标是尝试结合以下两个 sed 命令来打印一个输出。第一个命令用于去除 HTML 文件的 HTML 标记,第二个命令指定我只需要文件的第 11 行到第 16 行。

sed -e 's/<[^>]*.//g' file.html

sed -n '11,16p' file.html

我已经玩了一段时间了,当我打算显示行的输出时,似乎只能得到带有 HTML 标记的第 11-16 行的输出,或者没有 HTML 的所有行11-16 没有任何 HTML 标签。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • sed -e 's/&lt;[^&gt;]*.//g' file.htm | sed -n '11,16p'??
  • 如果是 GNU,sed -n '11,16{ s/&lt;[^&gt;]*.//g; p; }; 17q;' file.html

标签: sed


【解决方案1】:

天真的方法是使用管道:

sed 's/<[^>]*.//g' file.htm | sed -n '11,16p'

你也可以把地址和图案结合起来:

sed -n '11,16 s/<[^>]*.//pg' file.html

这里,

  • -n 将抑制默认行输出
  • 11,16 - 将设置地址,第 11 到 16 行
  • s/&lt;[^&gt;]*.// - 将查找&lt;,然后查找除&gt; 之外的零个或多个字符,然后查找任何一个字符(您的意思是&gt;?)
  • p - 打印替换结果
  • g - 所有出现在行中

online demo(缩短版,第 2-4 行):

#!/bin/bash
s="<111111>aaa<111111>
<22222>bbb<111111>
<33333>ccc<111111>
<44444>ddd<111111>
<55555>eee<111111>"
sed -n '2,4 s/<[^>]*.//pg' <<< "$s"

输出:

bbb
ccc
ddd

【讨论】:

    【解决方案2】:

    如果 GNU 兼容,

    sed -n '11,16{ s/<[^>]*.//g; p; }; 17q;' file.html
    

    范围将占用一个块,允许两个命令按顺序执行到每一行。 17q; 只是防止它在您已经知道不需要的线路上浪费时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-28
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多