7

在 linux 上,使用 bash shell,当我使用 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 脚本命令正在生成 CRLF eol 字符,而不仅仅是 LF eol 字符。

4

5 回答 5

6

^M并且^[是控制字符。正如您已经正确指出的那样,它们是一个字符,而不是两个字符,您可以通过按Ctrl+V然后在 vim 中键入它们Ctrl+[来获取^[.

因此,您要查找的替换命令看起来像s/^[//gc,与您尝试过的唯一区别是您无法按^[字面输入。

^M是一个CR(回车符)。有一些命令喜欢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时,它将调用包装脚本,该脚本依次调用/usr/bin/scriptdos2unix

于 2013-11-06T18:39:33.687 回答
5

为什么在linux上使用脚本命令时,生成的脚本会在行尾产生^M。这让我觉得 linux 脚本命令正在生成 CRLF eol 字符,而不仅仅是 LF eol 字符。

因为这是终端驱动程序插入的内容:

它是规范模式下的终端驱动程序,“在”伪终端“内部”,将 NLs 扩展为 CRNL 对。

于 2013-11-06T18:57:48.257 回答
1

我发现有些文件是为不同的行尾编写的。Unix、Dos 和 Mac。您可以通过重新编辑以下文件格式的文件来更改 VIM 看到这些的方式。我发现 ^M 在以 mac 格式编辑时会更改为换行符,因此在 VIM 中运行它。这并不是真正的搜索和替换,但有时系统需要文件位于特定行结尾,因此更改可能不明智。

:e ++ff=mac

然后,您将能够看到该文件的外观。

对于其他文件格式,其类似

:e ++ff=dos
:e ++ff=unix
于 2013-11-07T02:03:19.000 回答
1

命令

sed '/[[:cntrl:]].../s///g ; /[[:cntrl:]]/s///g' typescript > typescript2

对我来说很好

于 2017-01-26T08:33:11.713 回答
0

^M当您在 Windows 上编写脚本并将脚本移植到 linux 机器上时,字符出现在行尾。要删除此^M字符,您可以使用 linux build in 命令dos2unix,如下所示:

dos2unix script_name

^M这将从您的脚本中删除所有字符。我尚未对其进行测试,^[但我确信它适用于删除^M.

于 2013-11-06T18:48:31.400 回答