7

Linux では、bash シェルを使用して script コマンドを使用すると、生成されたファイルは typescript と呼ばれます。そのファイルを vim で開くと、各行に^M文字が含まれ、いくつかの行には (色付きのコマンド プロンプトのため) 文字^[が含まれます。これらの文字を何も置き換えずに、生成されたスクリプトから効果的に削除したいと思います。

まず、:%s/^[//gc:%s/\^[//gc:%s/\^\[//gc、およびその他のいくつかのバリエーションを試しました。それらのいずれも^[文字に一致しなかったため、検索/置換は機能しませんでした。

^M文字についても、これらすべてのバリアントを試してみましたが、同じ結果が得られました。グーグルで調べたところ、^M文字が実際にはキャリッジ リターン「\r」であることがわかりました。それで試してみたところ:%s/\\r//gc、これは^M文字でうまくいきました!

^[文字が何であるかを理解するために、さらにグーグルで検索しましたが、何も役に立ちませんでした。

2 つの質問:

1) ^[文字とは何ですか? vim で検索および置換するために使用する適切な正規表現は何ですか?

2) Linux で script コマンドを使用すると、生成されたスクリプトが行末に^Mを生成するのはなぜですか? これは、Linux スクリプト コマンドが LF eol 文字だけでなく、CRLF eol 文字を生成していると思わせます。

4

5 に答える 5

6

^Mおよび^[は制御文字です。あなたがすでに正しく指摘したように、それらは 2 文字ではなく 1Ctrl+V文字Ctrl+[です^[

したがって、探している置換コマンドは のようs/^[//gcになりますが、試したものとの唯一の違いは、^[文字どおりに入力できないことです。

^MCR(キャリッジリターン文字) です。dos2unixそのような文字を取り除くようなコマンドがあります。また、vimにはそれらを取り除くための組み込み関数がいくつかあります。

^[一方、 は色制御文字です。bash ではおそらく色付きの出力が得られますが、vim では制御文字のみが表示されます。

実際、 を使用すると、同じ制御文字が表示されscriptます。他の人は、この動作は予期されていると指摘していましたが、それを回避する簡単な方法が見つからなかったため、ラッパー スクリプトを作成しました。

#!/usr/bin/env bash

### Set the variable typescript to the last positional parameter passed to script
typescript="${!#}"
### If the last positional parameter is an option (and starts with "-"),
### set typescript to "typescript" (standard argument of script)
if [[ "${!#:0:1}" == "-" ]]; then
    typescript="typescript"
fi
### Invoke /usr/bin/script with all options passed to the wrapper script
/usr/bin/script $@
### Once script has finished, call dos2unix to get rid of control characters
dos2unix "$typescript"

これらの行を script というファイルに書き込んで、$PATH前の変数にあるディレクトリに置きます/usr/bin(私の場合は です~/bin)。ここで と入力type scriptすると、 ではなく、ラッパー スクリプトを指すはずです/usr/bin/script。ここで と入力scriptすると、ラッパー スクリプトが呼び出され、次に and が呼び出さ/usr/bin/scriptdos2unixます。

于 2013-11-06T18:39:33.687 に答える
5

Linux で script コマンドを使用すると、生成されたスクリプトが行末に ^M を生成するのはなぜですか。これは、Linux スクリプト コマンドが LF eol 文字だけでなく、CRLF eol 文字を生成していると思わせます。

それがターミナルドライバーが挿入するものだからです:

NLを…CRNLペアに展開しているのは、疑似端末の「内部」にある標準モードの端末ドライバーです。

于 2013-11-06T18:57:48.257 に答える
0

^MWindowsでスクリプトを記述し、Linuxマシンにスクリプトを移植すると、文字が行末に来ます。この文字を削除するには、次のよう^Mに linux build in コマンドを使用できます。dos2unix

dos2unix script_name

これにより、スクリプトからすべての^M文字が削除されます。私はそれをテストしていません^[が、削除するために機能すると確信してい^Mます。

于 2013-11-06T18:48:31.400 に答える