Viから「削除できない」行をどのように削除しますか?

Viから「削除できない」行をどのように削除しますか?

背景

誤って重要なPythonスクリプトを削除してコマンドを実行しました。

sudo grep --binary-files=text --context=100 'unique string' /dev/sda1 > recover_file

私のハードドライブから検索して一致するものを./recover_file./recover_file各登場の間に少しゴミがあります。しかし、予期しない動作を示す何百もの奇妙な行がありますが、これについて説明します。

私は行番号を持っています。行19がファイルの最初の奇妙な行である場合、ファイルを開くとウィンドウの下部にメッセージが表示されます。

Conversion error on line 19

最初にこれらの奇妙な行は、ファイルに表示する行がなくなったときに文書の下部に表示される行のように空白行として表示されます。~ウィンドウの一番左端に文字がありますが、他の2行の間にあります。ファイルの終わりではない行:

    18 junk junk junk
~
    20 junk junk junk

を使用して行19を削除しようとすると、dd何も起こりません。通常の行を削除すると、行19の外観が変わり、他の空の行のように見えます。

    18 junk junk junk
    19
    20 junk junk junk

ところで、カーソルをその上に移動すると、行番号が消えて以前のように見えます。テキストの挿入や追加などの操作を実行しようとすると、次の結果が表示されます。

Error: unable to retrieve line 19

ファイルをディスクに書き込むと、次のような結果が得られます。

Error: recover_file: Invalid or incomplete multibyte or wide character.
recover_file: WARNING: FILE TRUNCATED.

その後、ファイルを閉じて再度開くと、19行目から始まるすべての行が削除され、1行から18行しか残っていないことがわかります。状況を再現でき、最新バージョンのPythonファイルを新しいファイルにコピーした後、さらに掘り下げると./recover_file分割エラーが発生し、ファイル全体が失われました。

質問

1)後で参照できるように、重要なデータを失うことなくファイルを直接保存できるように、これらの奇妙な行を削除する方法はありますか?それとも、常にターミナルウィンドウで強調表示してコピーする必要がありますか?

./recover_file2)私は、この動作がテキスト文字と一致せず、Viがレンダリングできないバイナリコードの存在によって引き起こされると思います。誰かがこの印象を確認/修正し、追加の説明を提供できる場合は感謝します。

修正する

これが関連しているかどうかはわかりませんが、VMware Workstation 14 Playerで仮想マシンとしてlubuntu 18.04を実行しています。

ベストアンサー1

スクリプトを見ると、viテキストエディタを使用してバイナリをダンプし、編集、検索、行を編集したいと思います。

このようにして、行の概念、行の長さ、および場合によっては、ファイルの終わりの概念まで反転する多くの制御文字に会います。

あなたはテキストだけに興味があり、すでにディスクの内容をある程度解析しているので、ここではテキスト以外のstrings文字を削除するコマンドを追加します。

viで出力を処理するには、スクリプトを次のように変更できます。

sudo grep --binary-files=text --context=100 'unique string' /dev/sda1 | strings > recover_file

また、次のように、最初にこれらの制御文字を削除する方が効率的であると思います。

sudo strings /dev/sda1 | grep --context=100 'unique string' > recover_file

最後のコマンドはバイナリではなくテキストとして扱われるので、同じ結果を与えるかどうかはわかりません。

~からman strings

文字列 - ファイルに印刷可能な文字列です。

説明する

指定された各ファイルに対して、GNU文字列は、少なくとも4文字の長さ(または以下のオプションで指定されている数字)の印刷可能文字シーケンスと印刷できない文字を印刷します。デフォルトでは、他の種類のファイルの場合は、ターゲットファイルの初期化およびロード部分の文字列のみを印刷し、ファイル全体の文字列を印刷します。

おすすめ記事