回答:
さて、vim
自分自身を使用して:
vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...
これが何をするか:
setline (n, text)
まあ、これはline n
をに設定する関数ですtext
。call
関数を呼び出すために必要です。bufdo
バッファー間でコマンドを繰り返すために使用されます(範囲なしで、すべてのバッファーに作用します)。wq
バッファを保存して終了します。次のバッファに移動する前にこれを行う必要があるため、このコマンドはcall
を使用してコマンドにチェーンされ|
ます。-c cmd
run cmd
は、最初のバッファーを読み込んだ後のコマンドモードコマンドです。Nes
互換性のない、サイレント、元モードをオンにします。これは、非対話型処理に適しています。利点:
setline
-テキストコンテンツは、何もすることができます&
でのsed
置換テキストは、意図しない影響を持つことができます。sed
はるかに使いやすいようvim
ですが、同じことができるのは本当に素晴らしいです!答えてくれてありがとう!
bufdo
)。あなたがすでに開いているファイルを持つと...とに交互に表示するように考えてみましょう1s/foo/bar/
。
他のいくつかのオプション:
awk
(GNUの比較的新しいバージョンが必要ですawk
)
$ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
Perl /シェル
$ for f in *txt; do
perl -i -lne '$.==1 ? print "new line" : print' "$f"
done
シェル/コアユーティリティ
$ for f in *txt; do
( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f";
done
このスクリプトは、元のファイルを実際に変更せずに、変更したファイルを新しいディレクトリに配置して、要求どおりに実行します。
d=/tmp/cooked
mkdir $d
for f in * #will match all files in current directory; adjust as desired
do
echo "This is the new 1st line" > /${d}/${f}
sed 1d ${f} >> /${d}/${f}
done
tailおよびcatコマンドはこれを簡単に行います。
tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file
それらを適切なループでラップし、おそらくハードコードされた一時ファイル名の代わりに適切で正しい一時ファイルを使用します。bashやその他のシェルには、一時ファイルを作成するための構文があると思います。
tailの-nオプションには、引数にプラス記号があるかどうかに応じて2つの解釈があります。プラス記号がある場合は、指定された行番号から始まるファイルの末尾を表示することを意味します。それ以外の場合、数値は、最後の行を含む行の数であり、その末尾が出力されることになっています。
sed
実際に私が探していたものです!