读取文件并将每一行用制表符和空格附加到另一个文件中

读取文件并将每一行用制表符和空格附加到另一个文件中

我有以下代码:

#!/bin/sh

file_name="webproxy.conf"
echo "#generated code" > $file_name
while read line
do
    eval echo $line >> $file_name
done < "./template.txt"

模板.txt:

server {
    listen 80;
    location / {
        proxy_set_header  blabla ;
    }
}

输出为webproxy.conf

server {
listen 80;
location / {
proxy_set_header  blabla ;
}
}

我如何添加缺失的空格以美化结果文件

答案1

您可以使用此代码在最后格式化文件:

#!/usr/bin/awk -f

{sub(/^[ \t]+/,"");idx=0}
/\{/{ctx++;idx=1}
/\}/{ctx--}
{id="";for(i=idx;i<ctx;i++)id=sprintf("%s%s", id, "\t");printf "%s%s\n", id, $0}

演示:

#cat c
server {
listen 80;
location / {
proxy_set_header  blabla ;
}
}

# cat c | ./ngainx_fmt
server {
        listen 80;
        location / {
                proxy_set_header  blabla ;
        }
}

脚本ngainx_fmt在哪里awk

答案2

awk对于这样的任务来说它最容易使用。

$0 ~ /{/搜索左括号并设置缩进。

$0 ~ /}/搜索右括号并减少缩进。

{ print dent $0 }打印该行,并以缩进作为前缀。

空格缩进版本

file_name="webproxy.conf"
echo "#generated code" > $file_name

awk 'BEGIN { dent="";nspaces=3}
{ print dent $0 }
$0 ~ /{/ {for (n=0; n<nspaces;n++) dent=dent" "}
$0 ~ /}/ {dent=substr(dent, 0, length(dent)-nspaces)}
' template.txt >> $file_name

Tab 缩进版本:

file_name="webproxy.conf"
echo "#generated code" > $file_name

awk 'BEGIN { dent=""}
{ print dent $0 }
$0 ~ /{/ {dent=dent"\t"}
$0 ~ /}/ {dent=substr(dent, 0, length(dent)-1)}
' template.txt >> $file_name

相关内容