我正在尝试根据单词“ 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
根据上述命名约定,我希望获得给定数量的具有不同名称的文件(有多少资源块)。关于如何实现这一点的任何想法?另外,并非所有资源块的行数都相同。
答案 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)
如果我理解您的问题,并且您想将文件的内容分成单独的文件Granola
和airnow
,则没有理由使用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