vimでこの記号「^ @」を削除する方法は?


59

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

^ @

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

1つのファイルの行の例を次に示します。

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

回答:


51

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

  • %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、リリースcontrolshift

最後に、二つのコマンドの両方が生じるはずである%s/^@//g画面上に。^@手段(そうでない場合は表示されませんでしたNULLバイト、)単一の文字、ではない^が続く@ので、あなただけの入力はできません^し、@上記のコマンドの行インチ

このコマンドは、すべての^@


4
関連リンクを介してこの質問/回答につまずいた:これは実際には悪いアドバイスであり、ごくまれにしか適切に機能しません。nullバイトを削除するよりも、実際にエンコードを変更する方が適切です。nullバイトを削除しても、ゴミとして表示される他のマルチバイト文字が残っている場合があります。
マリオ14年

@Marioエンコードの変更について詳しく教えてください。それは以下のjrbの答えに関連していますか?
ジョージ14年

以下のrpyzhの回答を参照してください。適切なエンコーディングを使用してファイルをロードすることと、別のエンコーディングで保存することを示します(ただし、答えにはさらに説明が必要な場合があります)。Jrbの最後のメモは、読みたいだけなら十分ですが、別のエンコーディングを使用してヌルバイトなしで保存したい場合は十分ではありません。
マリオ

50

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

メモ帳を開いて「ファイル名」という単語を入力し、Unicodeビッグエンディアンとして保存するとします。このファイルの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は、nullバイトの代わりに^ @(または構成に応じて<00>)を挿入します。メモ帳はスペースを挿入します。

そのため、nullを削除するのではなく、Vimにファイルを正しく解釈させることを本当に検討する必要があります。次のコマンドを使用して、Vimに正しいエンコーディングでファイルをリロードさせることができます。

:e ++enc=utf16


はい、最後のコマンドはvimにファイルを正しく解釈させましたが、nullバイトを削除しません。
mrt181 2009年

6
、それらを削除し、別のエンコードを選択して、再度ファイルを保存するには::セットFENC = UTF-8
SCY

35

これは実際にvim内で私のために働いた:

:%s/\%x00//g

5
これはsubstitute()で機能しますが、Ctl-VCtl-Shift-2では機能しません。
dsummersl

私にとっても同じ問題で、私も<Ctrl-V><Ctrl-2>(と同様に)動作させることができませんでした<Ctrl-Shift-2>が、これは動作しました。
ジェフブリッジマン

5
これはLinuxで機能します。「00」は、コマンドモードで、あなたがそれの上にカーソルを置くことによって、vimの内の任意の文字を見つけることができますASCII進値、およびタイピング「GA」(「考えるGET ASCII)であるか:/など:コマンドラインでのASCII。VIM .wikia.com / wiki /…
ケーシージョーンズ14

^ Vx00も機能します。^ VuXXXXを使用して16ビットUnicodeを入力することもできます。私は検索で\%uXXXXを試しましたが、それも機能しました。
エドワードフォーク

時間の終わりまであなたは私の最愛の人になります。心の底から...ありがとう!
ゴンサロカオ

12

その「記号」は、ASCII値000のNULL文字を表します。

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

tr -d '\000' < file1 > file2

7

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

    :%s/Ctrl-V000//g

(スペースなし)。

同様に、次の方法でヌルを検索できます。

    /Ctrl-V000

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


6

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

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

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

貴重な情報。私の場合、BOMバイトのエンディアンでした。
アンドレアルバカーキ

3

受け入れられた解決策は私にはうまくいきませんでした。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'

2

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

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

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

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

dos2unix filename -rhelおよびその他

dos2ux filename [newfilename] -HP-UX


1

Vimでは、@ jrbの回答に加えて、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が適切な文字エンコードであるように見えるため)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.