加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell – 将文件的内容复制到相对于文件末尾的另一个文件中

发布时间:2020-12-15 21:24:59 所属栏目:安全 来源:网络整理
导读:StackExchange新手,请原谅我的错误. 我有一个输入文件,需要在最后一个字符之前复制到另一个文件中. inputfile.txt: input { "inputstuff"} filetowriteto.txt: Stuff { foo { "foostuff" } bar { "barstuff" }} 运行脚本后,生成的文件现在应该是: filetow
StackExchange新手,请原谅我的错误.

我有一个输入文件,需要在最后一个字符之前复制到另一个文件中.

inputfile.txt:

input {
       "inputstuff"
}

filetowriteto.txt:

Stuff {
       foo {
            "foostuff"
       }
       bar {
            "barstuff"
       }
}

运行脚本后,生成的文件现在应该是:

filetowriteto.txt:

Stuff {
       foo {
            "foostuff"
       }
       bar {
            "barstuff"
       }
       input {
              "inputstuff"
       }
}

基本上,脚本复制输入的行集并将它们粘贴到filetowriteto.txt中最后一个右括号之前.

该脚本不能依赖行数,因为filetowriteto.txt没有可预测数量的foo或bar行,我不知道如何使用sed或awk来执行此操作.

解决方法

尝试:

$awk 'FNR==NR{ if (NR>1) print last; last=$0; next} {print "       " $0} END{print last}' filetowriteto.txt inputfile.txt 
Stuff {
       foo {
            "foostuff"
       }
       bar {
            "barstuff"
       }
       input {
              "inputstuff"
       }
}

要更改文件:

awk 'FNR==NR{ if (NR>1) print last; last=$0; next} {print "       " $0} END{print last}' filetowriteto.txt inputfile.txt >tmp && mv tmp filetowriteto.txt

这个怎么运作

> FNR == NR {if(NR> 1)打印最后;最后= $0;下一个}

在读取第一个文件时,(a)如果我们不在第一行,则打印last的值,(b)将当前行的文本分配到last,(c)跳过其余命令并跳转到下一行.

这使用了常见的awk技巧.条件FNR == NR仅在我们读取第一个文件时才为真.这是因为,在awk中,NR是我们到目前为止读取的行数,而FNR是我们到目前为止从当前文件读取的行数.因此,FNR == NR仅在我们从第一个文件读取时才为真.
>打印“”$0

在读取第二个文件时,使用一些前导空格打印每一行.
> END {print last}

完成第二个文件的打印后,打印第一个文件的最后一行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读