gvim – vimでこの記号”^@”を削除するには?

find-and-replace gvim symbols vim

この記号で破損しているファイルがいくつかあるのですが、これはどうすればいいのでしょうか?

^@

これは文字列の一部ではありません。この記号を何もないものに置き換えたり、この記号を削除したりするにはどうすればいいのでしょうか?

ここでは、あるファイルからの一行の例を示します

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@

  67  mrt181  2009-11-25


ベストアンサー

試してみてはいかがでしょうか

  • %s/<CTRL-2>//g(普通のPCで)

  • %s/<CTRL-SHIFT-2>//g (Mac PCの場合)

ここで、<CTRL-2>は、通常のPCでは最初にCTRLを押し下げて、押し下げたままにして、2を打って、CTRLを解除することを意味します

で、<CTRL-SHIFT-2>は、まずMacの場合はcontrolを押したまま、押したまま、shiftを押して、2を押して、controlshiftを離して、2を押して、controlshiftを離します

最後に、2つのコマンドのどちらも画面上に%s/^@//gが表示されるようにします。^@は1文字(NULLバイト、そうでなければ表示されない)を意味し、^の後に@が続くわけではないので、上のコマンドで^@を並べて入力することはできません

このコマンドは、^@をすべて削除します

60  phresus  2009-11-25


ファイルが破損しているとは思いません。あなたの例の行は、各文字間にヌルバイトを含む通常のテキストを含んでいるように見えます。これは、それがUTF-16でエンコードされたテキストファイルであることを示唆していますが、ファイルの先頭にバイトオーダーマークがないことを示しています。http://en.wikipedia.org/wiki/Byte-order_mark を参照してください

メモ帳を開いて「ファイル名」と入力し、ユニコード・ビッグエンディアンで保存したとします。このファイルの16進ダンプは次のようになります

fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65

このファイルを Vim で開いてみると、問題なく見えます – ‘fe ff’ バイトは、ファイルがどのようにエンコードされているかを Vim に教えてくれます。ここで、全く同じバイト列を含むファイルを作成したとしますが、先頭の ‘fe ff’ がないとします。Vim はヌルバイトの代わりに ^@ (設定によっては <00>) を挿入します

ですから、ヌルを削除するのではなく、Vimがファイルを正しく解釈するようにすることが必要です。Vim に正しいエンコーディングでファイルをリロードさせるには、次のコマンドを実行します

:e ++enc=utf16

51  jrb  2009-11-25


これは実際にvimの中で私のために機能しました

:%s/\%x00//g

40  jriggins  2012-07-16


この「シンボル」は、ASCII 値 000 の NULL 文字を表しています

vimでの削除は難しいです、試してみてください

tr -d '\000' < file1 > file2

13  pavium  2009-11-25


他の人が指摘しているように、これらはヌルバイト(ASCII 00)です。Linuxでは、vimにASCII値を入力する方法は、Ctrl-Vを押した後、任意の文字の3桁の8進数値を入力することです。すべてのヌルバイトを置き換えるには、次のようにします

:%s/Ctrl-V000//g

(スペースを入れずに)

同様に、ヌルを検索するには、次のようにします

/Ctrl-V000

どちらの場合も、ゼロを入力している間は表示されませんが、3つ全て入力すると^@と表示されます。カラー端末では、制御文字であることを示すために青色で表示されます

8  TheAmigo  2014-09-12


FWIW, 私の場合、Macで作成したテキストファイルを編集するためにcygwin上でvimを使用しなければなりませんでした。受け入れられた解決策は、私のためには動作しませんでしたが、近くにありました。Vim wiki page about working with Unicodeによると、BOM バイトのビッグエンディアンとリトルエンディアンの違いがあるそうです。そのため、vimに明示的にリトルエンディアン版のBOMエンコーディングを使うように指示しなければなりませんでした

正しいエンコーディングを選択して初めて、ファイル形式(行末)をdosに変換し、Windowsのエディタで編集できるようになりました。エンコーディングを指定する前にファイルフォーマットをリセットしようとすると、私は悲惨な目に遭いました。使用したコマンドの完全なリストは以下の通りです

:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq

6  rpyzh  2013-10-24


受け入れられた解決策は、私にとってはうまくいきませんでした。代わりにvimにtrを経由してファイルをパイプさせてみました

:%!tr -d '\000'

これは、ビジュアルモード(:!tr -d '\000'と入力するだけ)や行の範囲でもうまく機能するでしょう

# Remove nulls from current line:
:.!tr -d '\000'

# Remove nulls from lines 3-5:
:3,5!tr -d '\000'

3  We Are All Monica  2012-07-12


^@ きちんとしたエンコーディングをしていれば悪い文字ではありませんが、削除したい場合は削除してみてください

  • tr -d '\000'
  • sed 's/\000//g'

例のデータには^M文字があります

ファイルをUnix/Linux形式に変換してから処理するには、試してみてください

dos2unix filename – ルエルなど

dos2ux filename [newfilename] – HP-UX

2  user490343  2015-08-30


jrbさんの回答に加えて、Vimではファイルの文字コードはfileencodingsオプションに基づいて検出されます。(fileencodingsの最後にある’s’に注意)

つまり、Windowsでは、fileencodingsオプションのデフォルト値はucs-bomになっています

ファイルの先頭にBOMが存在するかどうかをチェックします

BOMが存在する場合は、「BOMからファイルの文字エンコーディングを読み出す」

BOM が存在しない場合 (この場合は fileencodings オプションで指定したすべての文字エンコーディングが一致しなかったことを意味します)、 encoding オプションで指定した文字エンコーディングでファイルを読み込みます。encoding オプションのデフォルトの文字エンコーディングは以下の通りです。latin1.さて、latin1 は 1 バイト長の文字エンコーディングなので、ファイル内のすべてのバイトは有効な latin1 文字です (あなたが見ている Nul 文字 ^@ も)

*- 実際には、^@はVimのバッファテキストの改行文字であり、Nul文字ではありません

ファイルの正しい読み方は、文字エンコーディングをUTF-16に手動で指定することです(この場合はUTF-16が適切な文字エンコーディングのようです)

1  colemik  2013-06-10


タイトルとURLをコピーしました