如何在一个文件中创建多个文件,然后根据文件中的字符串命名每个文件?

时间:2019-07-18 16:21:02

标签: bash

我正在尝试根据单词“ resource”拆分文件并命名该文件,在下面的示例中,该文件将被命名为granola.tf,最后一个将被命名为airnow.tf:

resource "github_repository" "Granola" {
  name        = "Granola"
  private     = false
  description = "Something"
  has_wiki    = "false"
  has_downloads = "true"
  has_issues  = "false"
  archived    = "false"
}

...

resource "github_repository" "airnow" {
  name        = "airnow"
  private     = false
  description = "Something"
  has_wiki    = "true"
  has_downloads = "true"
  has_issues  = "true"
  archived    = "false"
}

我一直在尝试使用csplit命令,并认为我需要对此做些事情,但是不知道如何以不同的方式命名文件,我知道我应该能够使用prefix参数来做到这一点,但是我无法弄清楚这是我在下面尝试过的:

for i in $numberofresourceblocks; do
    csplit --prefix=PREFIX --elide-empty-files repositories.tf 
    /resource/ {1}
done

根据上述命名约定,我希望获得给定数量的具有不同名称的文件(有多少资源块)。关于如何实现这一点的任何想法?另外,并非所有资源块的行数都相同。

2 个答案:

答案 0 :(得分:1)

#!/bin/bash
csplit --elide-empty-files repositories.tf '/resource/' '{*}'
for file in xx*
do
    new=$(awk '{gsub("\"","",$3); print $3; exit}' "$file")
    mv "$file" "$new.tf"
done

说明:

  • 根据图案,重复使用图案({*})分割文件
  • 对于每个结果文件,请在第一行获得第三个字段并删除引号
  • 重命名文件

此文件应在包含repositories.tf的目录中运行,结果文件将输出到同一目录中。

这假设结果名称不会冲突(即没有两个Granolas),并且不会与“ repositories.tf”冲突。

答案 1 :(得分:0)

如果我理解您的问题,并且您想将文件的内容分成单独的文件Granolaairnow,则没有理由使用csplit。您可以使用简单的重定向使用GNU awk来完成您想做的所有事情。例如,给定您的输入文件(称为file

示例输入文件

$ cat file
resource "github_repository" "Granola" {
  name        = "Granola"
  private     = false
  description = "Something"
  has_wiki    = "false"
  has_downloads = "true"
  has_issues  = "false"
  archived    = "false"
}


resource "github_repository" "airnow" {
  name        = "airnow"
  private     = false
  description = "Something"
  has_wiki    = "true"
  has_downloads = "true"
  has_issues  = "true"
  archived    = "false"
}

一次调用awk,以检查行是否以resource开头并存储行,同时使用$3和{{1}将输出文件名与substr隔离},然后检查第一个字段是否为length并将已保存的行和当前行重定向到文件名,最后将其余name大于零的行重定向到输出文件名就是您所需要的,例如

示例用法

length

生成的输出文件

在输入$ awk ' /^resource/ { line=$0; fname=substr($3, 2, length ($3)-2); next } $1 == "name" { print line > fname; print $0 > fname; next} length($0) > 0 {print $0 > fname} ' file 上运行上述操作会导致该文件被分为两个单独的文件file

Granola

$ cat Granola resource "github_repository" "Granola" { name = "Granola" private = false description = "Something" has_wiki = "false" has_downloads = "true" has_issues = "false" archived = "false" } 文件:

airnow