すべてのファイルをループし、ファイルヘッダーを挿入する

すべてのファイルをループし、ファイルヘッダーを挿入する

次のようなダミー プロジェクトがあるとします。

$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh

すべての *.sh ファイルに著作権ファイル ヘッダーを挿入したいのですが、たとえばヘッダーは次のようになります。

/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */

複数行なので苦労しています。以下のスクリプトをなんとか記述しましたが、複数行では機能しません。

#!/bin/sh
HEADER=$(cat<<EOH
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
)

find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;

答え1

これを使って:

header='/*\n *  Copyright (c) 2015 by MyCompany, Inc.\n *  All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;

ノート:

  1. シェルは の値を$headersedコマンドに直接代入します。これにより、任意のコマンドをsedスクリプトに挿入できます。ないの情報源を信頼していない限り、これを実行しないでくださいheader

  2. ヘッダーには/文字が含まれています。これらの文字をエスケープするか、代替コマンドで別の区切り文字を使用する必要があります。上記では、 が|区切り文字として使用されました。

  3. シェル変数には小文字または大文字と小文字の混合を使用するのがベストプラクティスです。システムでは変数に大文字が使用されるため、この場合は問題にはなりませんが、誤って上書きすることは避けてください。

修正された sed コマンドを説明するために、次のテスト ファイルを検討してください。

$ cat file
1
2
3

sed コマンドは次を生成します:

$ sed "1s|^|$header|" file
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
1
2
3

関連情報