このシンボルで破損しているファイルがいくつかあります。
^ @
文字列の一部ではありません。検索できません。このシンボルを何もないものに置き換える方法、またはこのシンボルを削除する方法を教えてください。
これは、1つのファイルの例の行です。
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
あなたは試すことができます:
%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バイト。表示されない場合がある)を意味するため、単に^
と入力することはできません。上記のコマンドの行で@
。
このコマンドは、すべての^@
を削除します。
ファイルが破損しているとは思いません。例の行は、各文字の間に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
これは実際にはvim内で私のために働きました:
:%s/\%x00//g
その「シンボル」は、ASCII値000のNULL文字を表します。
Vimで削除するのは難しいので、試してみてください
tr -d '\000' < file1 > file2
他の人が指摘したように、これらはnullバイト(ASCII 00)です。 Linuxでは、ASCII値をvimに入力する方法は、Ctrl-Vに続けて任意の文字の3桁の8進値を押すことです。すべてのnullバイトを置き換えるには、次のコマンドを使用します。
:%s/
Ctrl-V000//g
(スペースなし)。
同様に、nullを検索するには次のようにします。
/
Ctrl-V000
どちらの場合も、入力時にゼロは表示されませんが、3つすべてを入力すると、^@
が表示されます。カラー端末では、それが青で表示され、制御文字であることを示します。
FWIW、私の場合、cygwinでvimを使用して、Macで作成されたテキストファイルを編集する必要がありました。受け入れられた解決策は私にはうまくいきませんでしたが、近かったです。 nicodeの使用に関するVim wikiページ によると、BOMバイトのビッグエンディアンとリトルエンディアンのバージョンには違いがあります。そのため、BOMエンコーディングのリトルエンディアンバージョンを使用するようにvim
に明示的に指示する必要がありました。
適切なエンコーディングを選択した後でのみ、ファイル形式(行末)をdos
に変換し、Windowsエディターでファイルを編集できるようにしました。エンコードを指定する前にファイル形式をリセットに設定しようとすると、悲しみになりました。ここに私が使用したコマンドの完全なリストがあります:
:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
受け入れられた解決策は私にとってはうまくいきませんでした。代わりに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'
^@
適切なエンコーディングを使用している場合は悪い文字ではありませんが、削除したい場合は次を試してください:
tr -d '\000'
sed 's/\000//g'
^ M文字はサンプルデータにあります
処理の前にファイルをUnix/Linux形式に変換するには、次のことを試してください。
dos2unix filename
-rhelおよびその他
dos2ux filename [newfilename]
-HP-UX
@jrbの回答に加えて、Vimでは、fileencodingsオプションに基づいてファイルの文字エンコーディングが検出されます。 (ファイルエンコーディングの最後にある「s」に注意してください)
つまりWindowsでは、fileencodings
オプションのデフォルト値はucs-bom
、つまり:
ファイルの先頭にBOMが存在するかどうかを確認してください。
BOMが存在する場合は、「ファイルの文字エンコーディングをBOMから読み取ります」。
BOMが存在しない場合(この場合は、fileencodings
オプションで指定されたすべての文字エンコードが一致しなかったことも意味します)、encoding
オプションで指定された文字エンコードでファイルを読み取ります。 encoding
オプションのデフォルトの文字エンコードは次のとおりです:latin1
。今、latin1
は1バイト長さの文字エンコーディング、allファイル内のバイトは有効ですlatin1
文字(Nul
文字も含む^@
表示されていること*)。
*-実際には、^@
はNim文字ではなく、Vimのバッファーテキスト内の改行文字です。
ファイルを読み取る適切な方法は、文字エンコードを手動でUTF-16として指定することです(この場合、UTF-16が適切な文字エンコードのように見えるため)。