ed: 最初の行をデフォルトの現在行として設定する

ed: 最初の行をデフォルトの現在行として設定する

ed大きなファイルの最初の行を編集するためにを使用しようとしていますが、すべての行が読み込まれるまで待たなければなりません。ファイル全体の読み取りを停止し、現在の行を最初の行としてすぐに編集を開始するed方法はありますか?ed

答え1

shellter が指摘したように、edこれは実行できません。ほとんどの編集操作ではファイルの書き換えが必要であり、置換のみがインプレースで実行できます。その場合は を使用できますhexedit(1)

メモリを最も消費しない方法はsed、例えば置換などの操作を使用することです。8月六月最初の行:

sed '1s/August/June/' FILE > NEWFILE

答え2

edエディターでドキュメントを開いた後、ファイル全体の読み取りを停止したり、編集バッファーの最初の行を自動的に現在の行にしたりすることはできません。

エディターedは常に、コマンドによって影響を受ける最後の行 (コマンドが の場合はその直後または直前d) に移動します。起動時にファイルを読み込むことは を使用することに似ておりe filename、現在の編集バッファを破棄し、指定されたファイルを編集用に開き、現在の行をファイルから読み取った最後の行に設定します。

大規模なドキュメントを非対話型の方法で変更したい場合は、sedまたは を使用するawkと、より良い代替手段が提供される場合があります。これらのツールはストリームで動作し、デフォルトではドキュメント全体をメモリに読み込まないためです。

巨大なドキュメントをインタラクティブに編集したい場合は、 を使用してドキュメントをチャンクに分割しsplit、変更したいチャンクを編集し (edまたはviまたはその他のエディターを使用)、 を使用してcatチャンクを連結し直すことをお勧めします。


巨大なファイルの最初の 5 行を編集するための仮想編集セッションed:

$エド
e ! head -n 5 巨大ファイル
123
g/^/m0
w ! { cat - ; tail -n +6 hugefile ; } >hugefile.new
質問

つまり、 の出力を編集するように要求しますhead -n 5 hugefile。ここで実行する編集は、単に行を逆にするだけです ( g/^/m0、「各行を順番に最初の行の前に移動」)。次に、変更された編集バッファをシェル コマンドに書き出します。シェル コマンドは、バッファの内容を元のファイルの 6 行目以降と連結します。結果は新しいファイル名に書き込まれます。Qその後、エディタを終了します。

関連情報