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

标签 shell awk sed posix sh

StackExchange 新手,请原谅我的错误。

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

输入文件.txt:

input {
       "inputstuff"
}

filetowriteto.txt:
Stuff {
       foo {
            "foostuff"
       }
       bar {
            "barstuff"
       }
}

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

filetowriteto.txt:
Stuff {
       foo {
            "foostuff"
       }
       bar {
            "barstuff"
       }
       input {
              "inputstuff"
       }
}

基本上脚本复制了 input一组行并将它们粘贴在 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) print last; last=$0; next}
    在读取第一个文件时,(a) 如果我们不在第一行,则打印 last 的值, (b) 将当前行的文本赋值给 last , 和 (c) 跳过其余的命令并跳转到 next线。

    这使用了一个常见的 awk 技巧。条件FNR==NR仅在我们读取第一个文件时为真。这是因为,在 awk 中,NR 是我们到目前为止读取的行数,而 FNR 是我们从当前文件中读取的行数。因此,FNR==NR仅当我们从第一个文件中读取时才为真。
  • print " " $0
    在读取第二个文件时,用一些前导空格打印每一行。
  • END{print last}
    打印完第二个文件后,打印第一个文件的最后一行。
  • 关于shell - 将一个文件的内容复制到另一个文件中相对于文件末尾的一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40033198/

    相关文章:

    regex - 在bash中使用sed换行,正则表达式问题

    linux - 从 tty 与脚本执行时 Awk 命令的结果不同

    linux - bash 脚本需要改进循环通过 12 小时前的目录,删除内部的符号链接(symbolic link)并删除目录

    cocoa - 在 Cocoa 中获取 shell 脚本的输出

    unix - shell 脚本算术运算

    linux - 如何在一行中搜索模式并打印该行中该模式之后存在的数据

    unix - 如何在ksh中反转字符串

    sed 替换未知字符串的位置匹配除以用户定义的分隔符

    javascript - 使用正则表达式替换函数调用

    linux - 在 shell 中解析非结构化数据