viで制御文字(^ @、^ M、^ I…)を検索および置換する


14

/proc/some_proc_id/cmdline私のubuntuマシンからこの行をコピーしました、

java^@-jar^@/usr/lib/selenium/selenium-server-standalone.jar^@-port^@4444^@-trustAllSSLCertificates^@

どういうわけか、スペース文字は^@viで表されます。コマンドを使用してスペース文字に置き換えようとしましたが、

:%s#^@# #g

しかし、それは言いpattern not found ^@ます。

特にカラット記号で始まる特殊文字をどのように置き換えることができますか?


使用している端末の種類は何ですか?
エドはヒール

時にはTERM何度もscreen

使用している端末プログラムは何TERMですか?環境変数は正しく設定されていますか?
エドはヒール

回答:


15

どういうわけか、スペース文字は^@viで表されます。

それはそうviではなかった。引数の間にスペースを入れてシェルにコマンドラインを入力しますが、コマンドラインは実際には、スペースで区切られた1つの長い文字列ではなく、内部的に文字列の連続したシーケンスです。シェルは、コマンドが起動される前に、コマンドラインを個々の引数文字列に分離しました。

Cでは、文字列はNUL文字で終了し、次のように表示されます。 ^@ます。

特にカラット記号で始まる特殊文字をどのように置き換えることができますか?

これらの文字を入力するには、先頭にControl-を付ける必要がありますv、リテラルの次の文字にを。

この場合の例:Control-にv続いてControl-@

リテラルの次の文字を導入する特殊文字は通常Control- vしかし、実際には設定可能です。入力stty -aして、設定内容を確認します。lnext出力を探します。


投稿は参考になります。しかし、私の質問の本当の解決策は、カラット記号をエスケープすること:%s#^@##gです。ターミナルから貼り付けたiをコピーしてから、viはそれらを元の文字として貼り付けました

1
そこので@MadhavanKumarあなたは、キャレット記号をエスケープしていないではありません何のキャレット記号。それは実際に実際の制御キャラクターです。^letterこれは単なる視覚的な表記であり、実際のキャレットは関係ありません。そして、はい、コントロール文字をエスケープする必要があります。Ctrl-Vはキーボードからそれを行う方法です。それはどこでも最もうまくいきます。参考までに、もう1つの答えにはvi、制御文字をまったく入力しなくても済むように、コマンドラインに固有の代替が含まれています。
Celada

@MadhavanKumar端末がNUL文字を2文字の文字列として表示し、^@それをコピーして貼り付けた場合\^@、viでその2文字の文字列を表すために使用します。多くのソフトウェアは、バックスラッシュを使用して「特別な機能を使用する代わりに、文字通り次の文字を解釈する」ことを意味します。
ジル 'SO-悪であるのをやめる'

@Gillesは、あなたが... ....私はCeladaに伝えるためにしようとしたものです正しいです

4

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

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

:%s/\%x00/ /g

代替案:

@記号が2キーの上にあるキーボードでは(Celadaに感謝)、次のことができます。

  • %s/<CTRL-2>/ /g (PC上)

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

ここで、<CTRL-2>最初CTRLにPCを押し下げ、押し下げたままにして、ヒット2、リリースを意味しCTRLます。

そして<CTRL-SHIFT-2>手段ダウン初回controlMac上、下、プレスを押してそれを維持shiftMac上で、押し、ヒットとしてそれを維持2、リリースcontrolおよびshift

最後に、2つのコマンドの両方が%s/^@/ /g画面に表示されるはずです。^@意味単一の文字ではなく、^続く@あなただけ入力することはできませんので、^@上記のコマンドの行では。

このコマンドは、すべての ^@をスペース文字に。

ソース


「PC」と言うとき、Windowsを意味しますか?
-Sparhawk

1
CTRL-2およびCTRL-SHIFT-2 @は、2キーの上にあるキーボードレイアウトでのみ意味があります。
セラダ

@Sparhawk:いいえ、Linux PCを意味します。:-)
エリック

CTRLを使用する理由 CTRLがキーの異なる意味を切り替えるために使用されるキーであるシステムを見たことはありません。通常はSHIFTです。
テルドン

それは奇妙です(おそらくvimのバグ?)が、動作します。通常、ctrl + shift + 2(us-キーボード上)です。別の質問として尋ねるか、vim開発者に尋ねてください。とにかく、Celadaの答えは制御文字に関してより一般的です。
エリック

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