grep' post_content'用cat&解析输入' post_name' .html

时间:2018-04-21 23:20:28

标签: unix sed grep yaml cat

示例条目:

  post_content: " some <strong >blablablabla</strong> text in <html>"
  post_title: Kontakt
  post_password:
  post_name: kontakt

问题: 我有一个带有上述条目的yaml文件,我想用cat&amp;解析post_content的内容。 grep并将其传递到不同的文件中。

   $ cat posts.yaml | grep post_content >> different-file.yaml

这很有效。非常好:)但是这样我只能从* posts.yaml中取消所有 post_content 在它之上我喜欢将每个 post_content 分隔成单独的文件,名为 post_name.yaml - 我认为它可能与某些sed-foo合并在一行中壳命令。但我总是不知道这样做。

1 个答案:

答案 0 :(得分:0)

尝试:

awk '/post_content:/{content=$0} /post_name:/{print content>$2".yaml"; close($2".yaml")}' posts.yaml

实施例

考虑这个测试文件:

$ cat posts.yaml 
post_content: " some <strong >blablablabla</strong> text in <html>"
post_title: Kontakt
post_password:
post_name: kontakt
post_content: " some other text in <html>"
post_title: Kontakt
post_password:
post_name: contact

然后我们运行:

awk '/post_content:/{content=$0} /post_name:/{print content>$2".yaml"; close($2".yaml")}' posts.yaml

运行此命令后,除posts.yaml外,还有当前目录中的两个新文件:

$ ls
contact.yaml  kontakt.yaml  posts.yaml

新文件的内容是:

$ cat kontakt.yaml 
post_content: " some <strong >blablablabla</strong> text in <html>"
$ cat contact.yaml 
post_content: " some other text in <html>"

如何运作

  • /post_content:/{content=$0}

    每次我们到达包含post_content:的行时,我们都会将该行保存在变量content中。

  • /post_name:/{print content>$2".yaml"; close($2".yaml")}

    每次我们到达包含post_name:的行时,我们都会打印变量content to a file whose name is given by the second field on the line followed by。yaml`。