【问题标题】:Print lines with sed using line number from grep使用 grep 中的行号使用 sed 打印行
【发布时间】:2014-05-03 14:00:29
【问题描述】:

我正在尝试将行号从 grep 传递到 sed。

首先我提取了我想用 sed 打印的开始行和结束行:

grep -n "Start" file1 | cut -d: -f 1 | head -n 1
grep -n "End" file1 | cut -d: -f 1 | head -n 1

现在我需要使用这些数字逐行打印从开始到结束的所有内容。例如

sed -ne '1,30w output1' file1

我不确定如何做到这一点,因为将行号通过管道传输到 sed 将被视为“输入”,对吗?

例子:

Start
some text
some more text
End
Start
some text
some more text
End

由于有不止一个开始和结束,我从 grep 中删除了其余的行号。我应该将 grep 和 sed 结合起来,或者这不可能吗?

【问题讨论】:

  • 你为什么要grep,你为什么不能用sed 本身呢? sed -n '/Start/,/End/w output1' file1
  • 如果您添加一个示例以及您喜欢输出的方式,将会有所帮助。
  • @clement 你能把它添加为答案吗?
  • 您首先对出现的StartEnd 的行进行编号,但之后您将使用cut 去掉编号。你给这些线编号是为了什么?
  • 我无法弄清楚实际的问题是什么。

标签: bash sed grep pipe


【解决方案1】:

没有grep也可以这样做

sed -n '/Start/,/End/w output1' file1

应该可以。

【讨论】:

    【解决方案2】:

    您似乎想要从第一次出现的 Start 到第一次出现的 End(包括端点)打印。那就是:

    awk '/Start/{found=1} found{print; if (/End/) exit}' file
    

    【讨论】:

    • 我更喜欢这个解决方案而不是使用/Start/,/End/ 范围,因为如果您需要其他适应,它会更灵活。
    • 那将是完全错误的方法,所以我不会这样做,但也许其他人会帮助你解决这个问题。祝你好运。
    【解决方案3】:

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

    sed -ne '/Start/,/End/w outputfile' -e '/End/q' file
    

    这将写入outputfile 第一个StartEnd 之间的行,然后退出并避免使用grep。

    如果你必须使用 grep 那么也许:

    sed -n "$(grep -n "Start" file | cut -d: -f 1 | head -n 1),$(grep -n "End" file | cut -d: -f 1 | head -n 1)"'p' file
    

    【讨论】:

    • 就是这样。我对 sed 中的 grep 使用了错误的语法。谢谢!
    猜你喜欢
    • 2015-10-28
    • 2014-08-07
    • 2021-12-30
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2017-04-13
    • 2013-04-25
    相关资源
    最近更新 更多