
.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 */
ノート
著作権テキストはファイルの先頭(
.c
および.h
)にのみ追加する必要があり、既存の著作権テキストは常にファイルの先頭にあります。親ディレクトリとサブディレクトリのすべてのファイルを検索、追加、または置き換える必要があります
.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
.
ed
w
q
EOF
これはループで簡単に使用できます。
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
答え2
少し汚れているが、次のPythonは動作します。
#!/usr/bin/python
import sys
filename = sys.argv[1]
fo=open(filename,'r+')
fr=fo.read()
frs=fr.replace('/* --------------------------------------------------\n Copyright 2014 Author name\n\n All rights reserved\n ----------------------------------------------------*/','/* Copy right text bla bla bla\n* some license text bla bla bla\n* All rights reserved xyz xyz */')
fo.seek(0,0)
fo.write(frs)
fo.close()
この方法は、元のテキストと代替テキストが次の場合に機能します。正確に質問に記載されているのと同じ形式を使用してください(ハイフンを含む)。次のコマンドを使用して、ファイルがあるディレクトリからこのPythonを呼び出します。
for i in ./{*.c,*.h} ; do python <scriptname.py> $i ; done
仕組み:
まっすぐ。ファイルを開き、その行の最初の一重引用符ペアの間に指定された行を、同じ行の2番目の一重引用符ペアfrs=fr.replace....
の間に指定された行に置き換えます。