Bash:将文件内容附加到新文件,并在每个文件中注释最后一行

Bash:将文件内容附加到新文件,并在每个文件中注释最后一行

我有以下文件,所有这些文件都包含缩小的 JavaScipt 代码。每个文件以注释结尾:

文件夹结构

|--static
  |--js
    |--1.1001bbaf.chunk.js
    |--runtime~main.229c360f.js
    |--main.57f2973b.chunk.js

1.1001bbaf.chunk.js

(window.webpackJsonp=window.webpackJsonp||[]).push .....
//# sourceMappingURL=1.1001bbaf.chunk.js.map

运行时~main.229c360f.js

!function(e){function r(r){for .....
//# sourceMappingURL=runtime~main.229c360f.js.map

main.57f2973b.chunk.js

(window.webpackJsonp=window.webpackJsonp||[]).push .....
//# sourceMappingURL=main.57f2973b.chunk.js.map

我的要求是将所有文件的内容刷新到单个文件中main.js,以便附加内容而不是覆盖内容。

我尝试了以下解决方案:

  1. cat static/js/*.js >> main.js

    效果很好,但它将第二个文件的内容附加在第一个文件的末尾,以注释结尾。像这样的东西:

//#sourceMappingURL=1.1001bbaf.chunk.js.map(window.webpackJsonp=window.webpackJsonp||[]).push .....

现在整行都是 vim 文本编辑器中的注释,从该行开始的所有内容都是 Atom 文本编辑器中的注释。

我的 Vim 文本编辑器的默认行为是,如果我o在命令模式下按下并且最后一行是注释//...,则新行以 开头//

我不知道如何处理以注释行结尾的文件。我可以想到这样的事情:从新行开始附加下一个文件的内容或删除最后一行注释。

限制是只能使用bash

Vim 代码快照

原子代码快照

答案1

文件的最后一行似乎没有以换行符结尾。这就是为什么一个文件的最后一行与下一个文件的第一行合并的原因。

您可以尝试在每个文件后添加一个换行符

for file in static/js/*.js
do
    cat "$file"
    echo
done >> main.js

该脚本不会检查文件是否以换行符结尾。如果文件以换行符结尾,则后面会跟一个空行。

答案2

这可能听起来有点黑客,但您可以利用 的行为,仅当文件不以 1 结尾时,sed它才会在文件之间添加一个字符:<newline>

sed ';' static/js/*.js >main.js

它将与 GNU 一起工作sed;我不确定其他实现。

例子:

$ printf '%s' line1 >file1
$ printf '%s\n' line2 >file2
$ printf '%s' line3 >file3

$ cat file*
line1line2
line3

$ sed ';' file*
line1
line2
line3

发生这种情况是因为,引用GNUsed的文档:

实际上,如果 sed 打印一行没有终止换行符,那么一旦有更多文本发送到同一输出流,它仍然会打印缺少的换行符,这给出了“最不预期的惊喜”,即使它不发出像 'sed 这样的命令-n p' 与 cat 完全相同。

上述命令将给出与以下相同的结果:

for file in static/js/*.js; do
    cat "$file"
    # Dump the last byte of each file and check if it is a
    # newline (hex encoding 0a); print a newline if it is not
    [ '0a' = "$(tail -c 1 "$file" | od -A n -t x1 | tr -d ' ')" ] || printf '\n'
done > main.js

除了最后一行:如果缺少,sed ';'则不会<newline>在最后一个文件后附加 a,而此循环会。

相关内容