オプション 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
するか、処理を行うことができます。