web-dev-qa-db-ja.com

このシンボル「^ @」をvimで削除する方法は?

このシンボルで破損しているファイルがいくつかあります。

^ @

文字列の一部ではありません。検索できません。このシンボルを何もないものに置き換える方法、またはこのシンボルを削除する方法を教えてください。

これは、1つのファイルの例の行です。

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

あなたは試すことができます:

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

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

ここで、<CTRL-2>は、最初に CTRL 通常のPCでは、押したままにして、 2、リリース CTRL

<CTRL-SHIFT-2>は、最初に control Mac PCでは、押したままにします。 shift Mac PCでは、押したままにして、 2、リリース control そして shift

最後に、2つのコマンドの両方で画面に%s/^@//gが表示されます。 ^@は、^の後に@が続くのではなく、1文字(NULLバイト。表示されない場合がある)を意味するため、単に^と入力することはできません。上記のコマンドの行で@

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

55
phresus

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

メモ帳を開いて「ファイル名」という単語を入力し、Unicode Big-endianとして保存したとします。このファイルの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

50
jrb

これは実際にはvim内で私のために働きました:

:%s/\%x00//g
35
jriggins

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

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

tr -d '\000' < file1 > file2
12
pavium

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

:%s/Ctrl-V000//g

(スペースなし)。

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

/Ctrl-V000

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

7
TheAmigo

FWIW、私の場合、cygwinでvimを使用して、Macで作成されたテキストファイルを編集する必要がありました。受け入れられた解決策は私にはうまくいきませんでしたが、近かったです。 nicodeの使用に関するVim wikiページ によると、BOMバイトのビッグエンディアンとリトルエンディアンのバージョンには違いがあります。そのため、BOMエンコーディングのリトルエンディアンバージョンを使用するようにvimに明示的に指示する必要がありました。

適切なエンコーディングを選択した後でのみ、ファイル形式(行末)をdosに変換し、Windowsエディターでファイルを編集できるようにしました。エンコードを指定する前にファイル形式をリセットに設定しようとすると、悲しみになりました。ここに私が使用したコマンドの完全なリストがあります:

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

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

:%!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

^@適切なエンコーディングを使用している場合は悪い文字ではありませんが、削除したい場合は次を試してください:

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

^ M文字はサンプルデータにあります

処理の前にファイルをUnix/Linux形式に変換するには、次のことを試してください。

dos2unix filename-rhelおよびその他

dos2ux filename [newfilename]-HP-UX

2
user490343

@jrbの回答に加えて、Vimでは、fileencodingsオプションに基づいてファイルの文字エンコーディングが検出されます。 (ファイルエンコーディングの最後にある「s」に注意してください)

つまりWindowsでは、fileencodingsオプションのデフォルト値はucs-bom、つまり:

ファイルの先頭にBOMが存在するかどうかを確認してください。

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

BOMが存在しない場合(この場合は、fileencodingsオプションで指定されたすべての文字エンコードが一致しなかったことも意味します)、encodingオプションで指定された文字エンコードでファイルを読み取ります。 encodingオプションのデフォルトの文字エンコードは次のとおりです:latin1。今、latin11バイト長さの文字エンコーディング、allファイル内のバイトは有効ですlatin1文字(Nul文字も含む^@表示されていること*)。

*-実際には、^@はNim文字ではなく、Vimのバッファーテキスト内の改行文字です。

ファイルを読み取る適切な方法は、文字エンコードを手動でUTF-16として指定することです(この場合、UTF-16が適切な文字エンコードのように見えるため)。

1
colemik