テキストブロックを追加または置換するシェルスクリプト?

テキストブロックを追加または置換するシェルスクリプト?

.c.hファイル(forおよびfiles)の先頭に著作権テキストを追加または置き換えることができるシェルスクリプト(Bash)を探しています。

スクリプトを実行する親ディレクトリにある.cすべてのファイルの著作権テキストブロックを検索、追加、または置き換える必要があります。.h

既存の著作権テキスト:

            /* --------------------------------------------------
                Copyright 2014 Author name

                All rights reserved
             ----------------------------------------------------*/

新しい著作権テキスト。

             /* Copy right text bla bla bla
              * some license text bla bla bla
              * All rights reserved xyz xyz */

ノート

  1. 著作権テキストはファイルの先頭(.cおよび.h)にのみ追加する必要があり、既存の著作権テキストは常にファイルの先頭にあります。

  2. 親ディレクトリとサブディレクトリのすべてのファイルを検索、追加、または置き換える必要があります.c.h

編集する

私が試したことは次のとおりです。

      for file in `find . -type f -name "*.h"`
       do
       echo $file
       if grep -qRin "                            ----------------------------------------------------------------------\*\/" $file
        then
       echo "Replaced License Text"
         sed '1,/^ ----------------------------------------------------------------------\*\/$/d' < $file | cat licence_file - > $file.new
       mv $file.new $file
      else
    cat licence_file $file >$file.new && mv $file.new $file
     echo "Added License Test"
     fi
      done

License_fileには新しいライセンステキストが含まれています。

ベストアンサー1

ed「標準テキストエディタ」です。日常の編集には適していませんが、スクリプトが簡単

ed file.c <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

最初のコマンドは、最初の行からa */*theと/エスケープする必要があります)を含む最初の行まで削除します。 2番目のコマンドは単純な挿入です。 「挿入」モードにi入るように指示しますが、コマンド自体は挿入モードを終了するように指示します。 「書き込み」を意味し、ファイルを保存することは「終了」を意味します。すべてはaで始まり終わる「ここのドキュメント」にあります(これはランダムです。必要な文字列を使用できます)。ed.edwqEOF

これはループで簡単に使用できます。

for f in ./*.{c,h}; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

再帰したい場合(つまり、サブディレクトリでの作業)、上記のshopt -s globstarコマンドでおよびを使用するか、whileループを使用してください。./**/*.{c,h}find

find . -name '*.c' -name '*.h' -print0 | while read -d '' f; do ed "$f" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF
done

これを何度も実行する可能性がある場合は、スクリプトに入れることをお勧めします。

#!/bin/sh
ed "$1" <<'EOF'
1,/\*\//d
i
/* Copy right text bla bla bla
 * some license text bla bla bla
 * All rights reserved xyz xyz */
.
w
q
EOF

名前を copyright.sh として指定し、 $PATH のどこかに置き、実行可能にすると、次のように簡単に実行できます。

shopt -s globstar
for f in ./**/*.{c,h}; do copyright.sh "$f"; done

おすすめ記事