これを行うには2つの方法が考えられます。
最初の方法は、ユーザーがファイルを所有していることを前提としていますが、ファイルは読み取り専用です。
書き込みコマンドにviの感嘆符の接尾辞(:w!)を使用して、独自のREADONLYファイルを強制的に上書きするだけです。もちろん、これは、現在のフォルダーに書き込みおよび実行する権限があることを前提としています。
:w!
viは元のREADONLYファイルを上書きします。
2番目の方法は、他の誰かがファイルを所有しており、そのファイルへの変更を保存することを想定しています。
これを達成する1つの方法は、vi内から元のファイルに加えられた変更をedスクリプトとして保存することです。このedスクリプトは、ed行エディターを使用して、vi以外で後で元のファイル(または他の同様のファイル)に適用できます。
現在の編集セッションをedスクリプトとして保存する方法は、元のファイル名と編集されたviバッファーを、-edコマンドラインスイッチを使用して標準ユーティリティとしてdiffユーティリティに渡すことです。
そのため、編集済みのviバッファーを想定して、以下を実行します
:.,$!diff --ed [original_file] -
これにより、現在のバッファー(。、$!)のすべての行が、元のファイルを現在のバッファーの内容に変換するために必要なdiffで生成されたedスクリプト(diff --ed [original_file]-)に置き換えられます。次に、このedスクリプトを安全な場所に保存し、書き込み可能な元のファイルのバージョンにスクリプトを適用します。したがって、スクリプトを書き込み可能な場所、たとえばログインフォルダーに保存します。
:w ~/my_ed_script
viを終了し、このedスクリプトを使用して、最初に保存できなかった編集済みファイルを取得します。bashコマンドラインプロンプト「$」からこれを実現する方法を次に示します。
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
このコマンドシーケンスが言葉で行うことは、diffで生成したスクリプトを連結し、ed書き込みコマンド「w」をedの標準入力にエコーすることです。Edは、このスクリプトを元のファイルの書き込み可能なコピーに適用し、変更されたバッファーの変更をファイルに書き戻します。
これは、viで実行された作業を、もともとvi、diff、およびedを使用して他の誰かが所有していたファイルに保存する方法です。