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.
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.
:%s/.\{6}$//
各行の終わりから文字通り 6 文字を削除するために使用できます。
は:
、コマンドを実行できる ex モードを開始します。%
このコマンドがファイル全体に対して動作することを指定する範囲です。は代替のs
略で、その後にパターンと置換文字列が の形式で続きますs/pattern/replacement/
。この場合のパターンは、.\{6}$
任意の文字 ( .
) を正確に 6 回 ( \{6}
) に続けて行末 ( ) に一致させ$
、それを置換文字列に置き換えることを意味します。したがって、上で述べたように、これはすべての行の最後の 6 文字に一致し、何も置き換えません。
グローバルコマンドを使用します。
これを試して:
:g/$/norm $xxxxxx
あるいは:
:g/$/norm $5Xx
この問題の鍵は、削除しようとしている文字に固有のものではなく、一般的なものにすることだと思います。そうすれば、学んだテクニックは他の多くの状況に適用できます。
これが ANSI エスケープ シーケンスであると仮定すると、 は^[
1<Esc>
文字を表します。Ctrl+ V(多くの Windows Vim インストールではCtrl+ Q) を押して入力し、その後にEsc. これもわずかに異なる色で強調表示されていることに注意してください。
すべての行の最後の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
それらがすべて整列している場合は、視覚ブロックの選択を行ってから削除できます。
それ以外の場合、入力方法がわからないシーケンスがある場合は、 を押して視覚的に選択しv
、マークしてヤンクできy
ます (デフォルトでは register に"
)。次に、入力:%s/<C-R>"//g
して削除します。
ノート:
<C-R>"
レジスタの内容を"
カーソル位置に置きます。"ay
ヤンクした場合、たとえば (レジスターへのa
ヤンク - 私はこれをピグラタンのヤンクと呼んでいます)、それをどこに置いたか忘れた場合は、レジスターの内容を で見ることができます:reg
。<C-R>
Vim はCtrl+を話すかRこれは、行の長さが 5 文字を超える場合にうまく機能するようです。
:perldo $_ = substr $_, 0, -5
ただし、行の長さが 5 文字以下の場合は何もしません。文字列の最後の 5 文字を削除する簡単な方法が perl にあるのかもしれませんが、私にはよくわかりません :)
これを使用して削除します。
:%s/^[[00m//gc