【问题标题】:How to print a value/values that is in the next line of the pattern matched using sed如何打印使用 sed 匹配的模式下一行中的值/值
【发布时间】:2017-12-01 04:58:37
【问题描述】:

我正在尝试读取与模式匹配的文件,但我想要的值在接下来的连续行中并且是动态的(意味着不同文件的值数量不同)。有人可以帮助我使用 sed 实现这个逻辑吗?

文件 1:

hosts:
 - abc
 - def

文件 2:

hosts:
 - abc
 - def
 - ghi

我想使用 sed 获取主机的值。 文件 1 的 sed 应该返回

 - abc
 - def

file2 的 sed 应该返回

 - abc
 - def
 - ghi

谢谢。

【问题讨论】:

  • file 1: hosts: -abc - def file 2: hosts: -abc - def - ghi 文件 1 的 sed 应该返回 -abc - def 和 file2 的 sed 应该返回 -abc - def - ghi
  • 在每行代码/数据/错误消息的前面使用4个空格或突出显示一个文本块并使用编辑框左上方的{}格式工具格式化为代码/数据/输出。祝你好运。
  • 如何理解hosts列表结束?下面一行是什么?
  • 它们以空行结束。

标签: python bash awk sed


【解决方案1】:

打印hosts 和下一个空白行之间的行(如 cmets 中所述):

sed '/^hosts/,/^$/{//d;}' file

【讨论】:

    【解决方案2】:
    cat file1 | tail -n+2
    

    如果你只有一行标题,然后是主机,就会这样做。

    【讨论】:

    • 感谢您的快速回复。实际上,主机的值在下一个连续行中,而不是与主机在同一行中(因此 abc 在新行中,def 在新行中,依此类推......)。我不知道为什么 stackoverflow 将值发布在与主机相同的行中。我还提到了两个文件,只是为了举例。我只需要使用 sed 或其他工具从文件中获取主机的值。
    • 这看起来像一个 yaml 文件。
    • 你最好使用 yaml 解析工具,比如 python 和 pyyaml
    • 如果hosts:是文件中的第一个,而且前面只有-的条目,你可以直接cat file1 file2 | grep -v "hosts:"
    • 甚至cat file1 | tail -n+2
    【解决方案3】:

    这有点笨拙,但似乎有效:

    sed -n -e ':a' -e '/\n$/{s/hosts:\n//; p;}' -e '/hosts/N' -e '/hosts/ b a' filename
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2019-01-03
      • 2020-08-16
      相关资源
      最近更新 更多