2

重複の可能性:
ファイル内のテキストを検索して置換/挿入するためのSed/Awk

1 つのディレクトリに含まれる複数のテキスト ファイルに 1 つの「ヘッダー」行を追加する方法を知りたいです。Bashコマンドラインは素晴らしいでしょう!

どうも。

編集

私はここで私のニーズを見つけました: http://perldoc.perl.org/index-faq.htmlお楽しみください! これが私の答えです:

perl -pi -e 'print "**MyHeaderText**\n" if $. == 1' *
4

1 に答える 1

7

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

于 2012-11-02T14:34:36.150 に答える