オプション 1: ほとんどすべてのバージョンの Unix で動作します
tmp=$(mktemp) # Create a temporary file
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
header="This is the header line to be inserted"
for file in "$@"
do
{
echo "$header"
cat $file
} > $tmp
mv $tmp $file
done
rm -f $tmp
trap 0
これにより、一時ファイルが安全に作成され、シグナル (HUP、INT、QUIT、PIPE、および TERM) の適切なコレクションの下で確実に削除されます。次に、メイン ループはヘッダー文字列とファイルを一時ファイルにコピーし、一時ファイルを元のファイルの上に移動し、(何か問題が発生した場合に備えて) 残りのファイルを削除し、シェルが正常に終了できるようにクリーンアップをキャンセルします。
元のファイルに複数の (ハード) リンクがある場合、またはそれがシンボリック リンクである場合、これらの特別なプロパティは失われます。これを修正するには、 を使用する必要cp $tmp $fileがあり、ファイルも削除する必要があります$tmp。
コマンドがない場合はmktemp、次を使用できます。
tmp=${TMPDIR:-/tmp}/ins.$$
名前を生成します。mktemp特にルートとして実行している場合は、名前からより簡単に予測でき、安全性が低くなります。$TMPDIR複数のファイルシステムがあるかのように、現在のディレクトリを使用することにも知恵があるかもしれません。
オプション 2: GNU sed
GNUsedを使用していて、処理するシンボリック リンクまたはハード リンクがない場合は、その-iオプションを使用してインプレース変更を行うことができます。
header="This is the line to be inserted"
for file in "$@"
do
sed -i -e "1i\
$header" $file
done
$headerこれにより、各ファイルの最初の行の前にの値が挿入されます。編集スクリプトをファイルに書き込んsed -i -f sed.script $fileで、ループ内のぎこちないインデントを避けるために使用できます。
オプション 3: その他のツール
他にも多くの可能なテクニックがあります。たとえば、edまたはexを使用してファイルを編集できます。Perl または Python を使用awkするか、処理を行うことができます。