.c、.h、およびmakefileに含まれるライセンステキストを追加または置き換えるシェルスクリプト(bash)はありますか?

.c、.h、およびmakefileに含まれるライセンステキストを追加または置き換えるシェルスクリプト(bash)はありますか?

フォルダには*.c、*.h、およびMakefileのセットがあり、その一部にはライセンステキストが含まれており、一部にはライセンステキストが含まれていません。したがって、ファイルにライセンステキストがない場合はライセンステキストを追加し、ライセンステキストがすでに存在する場合はそれを新しいライセンステキストに置き換えることができるシェルスクリプトが必要です。

例えば

Folder1
┣━ *.c
┣━ *.h
┣━ Folder2
┃  ┣━ *.c
┃  ┣━ *.h
┃  ┣━ Makefiles
┃  ┗━ Folder4
┗━ Folder3
   ┣━ *.c
   ┣━ *.h
   ┗━ Makefiles

メモ:ライセンステキストは常にファイルの先頭にあります。

既存のライセンステキストの例:

# Copyright (C) 2008 Jack <[email protected]>

# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.

新しいライセンステキストは次のようになります。

/*---------------------------------------------------------------------

Copyright © 2014  Author Name

All rights reserved

----------------------------------------------------------------------*/

Makefileの場合は、次のようになります。

# ---------------------------------------------------------------------
# Copyright © 2014  Author Name
#
# All rights reserved
# ----------------------------------------------------------------------

ベストアンサー1

バッシュを仮定すると:

function remove_copyright {
    printf "%s\n" 1,10d w q | ed "$1"
}

function add_copyright {
    if [[ $1 == Makefile ]]; then
        ed "$1" <<END
0i
# ---------------------------------------------------------------------
# Copyright © 2014  Author Name
#
# All rights reserved
# ---------------------------------------------------------------------
.
w
q
END
    else
        ed "$1" <<END
0i
/*---------------------------------------------------------------------

Copyright © 2014  Author Name

All rights reserved

---------------------------------------------------------------------*/
.
w
q
END
    fi
}

shopt -s nullglob globstar
for file in **/*.[ch]; do
    if grep -q '^# Copyright \(C\)' "$file"; then
        remove_copyright "$file"
    fi
    add_copyright "$file"
done

おすすめ記事