Bash:新しいファイルにファイルの内容を追加し、各ファイルの最後の行にコメントを追加します。

Bash:新しいファイルにファイルの内容を追加し、各ファイルの最後の行にコメントを追加します。

次のファイルがあり、すべて縮小されたJavaScriptコードが含まれています。各ファイルはコメントで終わります。

フォルダ構造

|--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

    これはうまく機能しますが、2番目のファイルの内容を最初のファイルの最後に追加してコメントで終わります。このような:

//#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

最後の行を除いて、欠落している場合、aは最後のファイルに追加されませんが、sed ';'このループは追加されます。<newline>

関連情報