Shell : 分解并保存文件

Shell : Explode and Save file

我需要一些帮助。

site.txt

[site1] 

server{ 
root test; 
server_name test.com; 
} 

END 

[site2] 

server{ 
root game; 
server_name game.com; 
} 

END 

这是我使用的命令

sudo awk -v RS='END\n' 'NF{f=; gsub(/[][]/, "", f); printf "%s", [=12=] > (f ".txt")}' site.txt 

输出显示

site1.txt

[site1] 

server{ 
root test; 
server_name test.com; 
} 

site2.txt

[site2] 

server{ 
root game; 
server_name game.com; 
} 

my objective 是从输出中删除 [site1][site2]

您需要允许 END 前后的空格作为分隔符以删除新行,并且还需要调用 sub 函数以丢弃输出中的第一行。你可以使用这个命令

awk -v RS='[[:space:]]*END[[:space:]]+' 'NF {
   f = ;
   gsub(/[][]/, "", f)
   sub(/^[[:space:]]*\[[^]]*\][[:space:]]+/, "")
   print > (f ".txt")
}' site.txt

输出:

cat site.txt

server{
root test;
server_name test.com;
}

cat site2.txt

server{
root game;
server_name game.com;
}

详情:

  • -v RS='[[:space:]]*END[[:space:]]+':将输入记录分隔符设置为 END 前后有空格
  • NF{...}: 只对非空行执行
  • f=: 保存 </code> 即 <code>[...] 行到变量 f
  • gsub(/[][]/, "", f):从变量 f
  • 中删除 []
  • sub(/^[[:space:]]*\[[^]]*\][[:space:]]+/, ""): 从每个块中删除第一行
  • print > (f ".txt"):将单个记录重定向到文件名,文件名的值为 f,后跟扩展名 ".txt".