40

I have the following characters being repeated at the end of every line:

^[[00m

How can I remove them from each line using the Vim editor?

When I give the command :%s/^[[00m//g, it doesn't work.

4

7 に答える 7

84

:%s/.\{6}$//各行の終わりから文字通り 6 文字を削除するために使用できます。

:、コマンドを実行できる ex モードを開始します。%このコマンドがファイル全体に対して動作することを指定する範囲です。は代替のs略で、その後にパターンと置換文字列が の形式で続きますs/pattern/replacement/。この場合のパターンは、.\{6}$任意の文字 ( .) を正確に 6 回 ( \{6}) に続けて行末 ( ) に一致させ$、それを置換文字列に置き換えることを意味します。したがって、上で述べたように、これはすべての行の最後の 6 文字に一致し、何も置き換えません。

于 2012-07-10T18:56:06.917 に答える
19

グローバルコマンドを使用します。

これを試して:

:g/$/norm $xxxxxx

あるいは:

:g/$/norm $5Xx

この問題の鍵は、削除しようとしている文字に固有のものではなく、一般的なものにすることだと思います。そうすれば、学んだテクニックは他の多くの状況に適用できます。

于 2012-07-10T12:15:18.830 に答える
6

これが ANSI エスケープ シーケンスであると仮定すると、 は^[1<Esc>文字を表します。Ctrl+ V(多くの Windows Vim インストールではCtrl+ Q) を押して入力し、その後にEsc. これもわずかに異なる色で強調表示されていることに注意してください。

于 2012-07-10T09:08:47.367 に答える
5

すべての行の最後の6文字を、それらの文字が何であるかに依存せずに置き換えるのは簡単ですが、かなりのエラーの余地があるため、お勧めしません。また、がエスケープ文字の場合、実際には5文字^[を探しています。

エスケープコード

ga文字を使用して、^[それがエスケープコードであるかどうかを判断できます。エスケープコードの場合、ステータスバーが表示されます。

<^[>  27,  Hex 1b,  Octal 033

そうだとすれば、を使用してすべてを置き換えることができます

:%s/\%x1b\[00m$//gc

\%x1b上記の16進値から取得します。[角かっこ( )はVim正規表現で予約されている文字であるため、角かっこ()をエスケープする必要があることにも注意してください。$行の終わりで発生することを確認し、/gcフラグによってグローバルになり、各置換を確認します(を押しaてすべてを置換できます)。

コードをエスケープしない

それは逃げるという単純な問題です。以下の2つのいずれかを使用できます。

:%s/\^\[\[00m$//gc
:%s/\V^[[00m\$//gc
于 2012-07-12T01:16:59.957 に答える
4

それらがすべて整列している場合は、視覚ブロックの選択を行ってから削除できます。

それ以外の場合、入力方法がわからないシーケンスがある場合は、 を押して視覚的に選択しv、マークしてヤンクできyます (デフォルトでは register に")。次に、入力:%s/<C-R>"//gして削除します。

ノート:

  • <C-R>"レジスタの内容を"カーソル位置に置きます。
  • それを別のレジスターに"ayヤンクした場合、たとえば (レジスターへのaヤンク - 私はこれをピグラタンのヤンクと呼んでいます)、それをどこに置いたか忘れた場合は、レジスターの内容を で見ることができます:reg
  • <C-R>Vim はCtrl+を話すかR
于 2012-07-10T09:23:22.383 に答える
1

これは、行の長さが 5 文字を超える場合にうまく機能するようです。

:perldo $_ = substr $_, 0, -5

ただし、行の長さが 5 文字以下の場合は何もしません。文字列の最後の 5 文字を削除する簡単な方法が perl にあるのかもしれませんが、私にはよくわかりません :)

于 2012-07-16T20:37:11.350 に答える
0

これを使用して削除します。

:%s/^[[00m//gc
于 2012-07-10T08:43:58.627 に答える