vim: 如何将显示的特殊字符^H转换成“向后删除一个字符”的动作?

128 views
Skip to first unread message

ping

unread,
Aug 27, 2012, 9:47:11 AM8/27/12
to vim...@googlegroups.com
类似的问题一直困扰着我。
打开一个log文件,

PRVDRI-VFTTP-32:vol#show term len 50
PRVDRI-VFTTP-32:vol#show subsc
PRVDRI-VFTTP-32:vol#show subscribers


注意上面的空格,因为email程序中不显示特殊字符。在我的vim中是如此显示的:

5057 ^MPRVDRI-VFTTP-32:vol#show ^H^H^H^H^H ^H^H^H^H^Hterm len 50


5058 ^MPRVDRI-VFTTP-32:vol#show subsc
5059 ^MPRVDRI-VFTTP-32:vol#show subscribers

很明显,操作的人输入命令的时候,犹豫了一下,回头删除了,又输入了新命令。
但记录日志的程序没有做转换,忠实的记录所有输入的键盘序列。导致了混乱。

有没有办法在vim中,做substitute,把所有的^H这类特殊字符,转换成先后删除
一个字符的动作?

类似出现在日志中的还有^M (google中讨论较多), ^G, ...

夏凯

unread,
Aug 27, 2012, 10:02:18 AM8/27/12
to vim...@googlegroups.com
s/.^H//g,注意这个^H的输入方式是CTRL+V+H,或者简单点,用s/.\b//g。
On 2012年08月27日 21:47, ping wrote:
> 类似的问题一 直困扰着我。

ping

unread,
Aug 27, 2012, 10:15:46 AM8/27/12
to vim...@googlegroups.com, 夏凯
лл��
�����Dz��еġ���������ֻ��ɾ���^H���ѡ�

PRVDRI-VFTTP-32:vol#show ^H^H^H^H^H ^H^H^H^H^Hterm len 50

����Ҫ���ǰ�"show"��ɾ����������ɾ��#��֮ǰ����ʾ������Ҫ���

PRVDRI-VFTTP-32:vol#term len 50

Ҳ����˵��

���^H�ĸ�������ǰ���Ѿ���������ַ���ʾ��#�����û�����IJ��֣��ĸ�
���ֻ�����ɾ����^H����������ַ�
���^H�����ࣨ�û�����BS���ɾ����ʾ��#Ϊֹ,��Ҫ������ǰɾ���ˡ�

�����������е㸴���ˣ���

On 08/27/2012 10:02 AM, �Ŀ� wrote:
> s/.^H//g��ע�����^H�����뷽ʽ��CTRL+V+H�����߼򵥵㣬��s/.\b//g��
> On 2012��08��27�� 21:47, ping wrote:
>> ���Ƶ�����һ ֱ�������ҡ�
>> ��һ��log�ļ���
>>
>> PRVDRI-VFTTP-32:vol#show term len 50
>> PRVDRI-VFTTP-32:vol#show subsc
>> PRVDRI-VFTTP-32:vol#show subscribers
>>
>>
>> ע������Ŀո���Ϊemail�����в���ʾ�����ַ����ҵ�vim���������ʾ�ģ�
>>
>> 5057 ^MPRVDRI-VFTTP-32:vol#show ^H^H^H^H^H ^H^H^H^H^Hterm len 50
>>
>> 5058 ^MPRVDRI-VFTTP-32:vol#show subsc
>> 5059 ^MPRVDRI-VFTTP-32:vol#show subscribers
>>
>> �����ԣ������������������ʱ����ԥ��һ�£���ͷɾ���ˣ�������������
>> � ����¼��־�ij���û����ת������ʵ�ļ�¼��������ļ������С�������
>> ���ҡ�
>>
>> ��û�а취��vim�У���substitute�������е�^H���������ַ�ת�����Ⱥ�ɾ
>> �� һ���ַ�Ķ�����
>>
>> ���Ƴ�������־�еĻ���^M ��google�����۽϶ࣩ, ^G, ...
>>
>

夏凯

unread,
Aug 27, 2012, 10:25:14 AM8/27/12
to ping, vim...@googlegroups.com
我这可以啊,你没加那个“.”么?不过如果他多按一个回退的话,是不是还要判断
是否到头了?
On 2012年08月27日 22:15, ping wrote:
> 谢谢。
> 这样是不行的。。。这样只是删除掉^H而已。
>
> PRVDRI-VFTTP-32:vol#show ^H^H^H^H^H ^H^H^H^H^Hterm len 50
>
> 我需要的是把"show"都删掉,但不能删掉#和之前的提示符,最终要变成
>
> PRVDRI-VFTTP-32:vol#term len 50
>
> 也就是说:
>
> 如果^H的个数少于前面已经键入的正常字符(提示符#后面用户键入的部分)的个
> 数,就只是往回删除与^H个数等量的字符。
> 如果^H个数过多(用户狂敲BS键),就删到提示符#为止,不要继续往前删除了。
>
> 估计我需求有点复杂了??
>
> On 08/27/2012 10:02 AM, 夏凯 wrote:
>> s/.^H//g,注意这个^H的输入方式是CTRL+V+H,或者简单点,用s/.\b//g。
>> On 2012年08月27日 21:47, ping wrote:
>>> 类似的问题一 直困扰着我。
>>> 打开一个log文件,
>>>
>>> PRVDRI-VFTTP-32:vol#show term len 50
>>> PRVDRI-VFTTP-32:vol#show subsc
>>> PRVDRI-VFTTP-32:vol#show subscribers
>>>
>>>
>>> 注意上面的空格,因为email程序中不显示特殊字符。在我的vim中是如此显示的:
>>>
>>> 5057 ^MPRVDRI-VFTTP-32:vol#show ^H^H^H^H^H ^H^H^H^H^Hterm len 50
>>>
>>> 5058 ^MPRVDRI-VFTTP-32:vol#show subsc
>>> 5059 ^MPRVDRI-VFTTP-32:vol#show subscribers
>>>

依云

unread,
Aug 28, 2012, 12:14:59 PM8/28/12
to vim...@googlegroups.com
能不用 vim 么? ^M 的话可以直接替换成空或者 \r(如果你希望它导致换行)。
^G 不知道是什么。

--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
http://lilydjwg.is-programmer.com/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

夏凯

unread,
Aug 28, 2012, 9:03:32 PM8/28/12
to vim...@googlegroups.com
man ascii打开ascii表,然后找对应的行就行了,
^G是第7个字符,所以对应07 BEL '\a' (bell)这行,
^H是第8个字符,所以对应08 BS '\b' (backspace)这行,
^I是第9个字符,所以对应09 HT '\t' (horizontal tab)这行,
^J是第10个字符,所以对应0A LF '\n' (new line)这行,
^M是第13个字符,所以对应0D CR '\r' (carriage ret)这行。
其实^M的话,是回车,就像expect里面要send $passwd\r一样,这个要看你的程序
怎么处理了。如果只是\r\n中的\r,直接删掉好了。

ping

unread,
Aug 28, 2012, 11:35:55 PM8/28/12
to vim...@googlegroups.com, 夏凯
On 8/28/2012 9:03 PM, �Ŀ� wrote:
> man ascii��ascii�?Ȼ���Ҷ�Ӧ���о����ˣ�
> ^G�ǵ�7���ַ����Զ�Ӧ07 BEL '\a' (bell)���У�
> ^H�ǵ�8���ַ����Զ�Ӧ08 BS '\b' (backspace)���У�
> ^I�ǵ�9���ַ����Զ�Ӧ09 HT '\t' (horizontal tab)���У�
> ^J�ǵ�10���ַ����Զ�Ӧ0A LF '\n' (new line)���У�
> ^M�ǵ�13���ַ����Զ�Ӧ0D CR '\r' (carriage ret)���С�
> ��ʵ^M�Ļ����ǻس�������expect����Ҫsend $passwd\rһ�����Ҫ����ij���
> ��ô�����ˡ����ֻ��\r\n�е�\r��ֱ��ɾ�����ˡ�
> On 2012��08��29�� 00:14, ���� wrote:
>> On Mon, Aug 27, 2012 at 09:47:11AM -0400, ping wrote:
>>> ���Ƶ�����һֱ�������ҡ�
>>> ��һ��log�ļ���
>>>
>>> PRVDRI-VFTTP-32:vol#show term len 50
>>> PRVDRI-VFTTP-32:vol#show subsc
>>> PRVDRI-VFTTP-32:vol#show subscribers
>>>
>>>
>>> ע������Ŀո���Ϊemail�����в���ʾ�����ַ����ҵ�vim���������ʾ�ģ�
>>>
>>> 5057 ^MPRVDRI-VFTTP-32:vol#show ^H^H^H^H^H ^H^H^H^H^Hterm len
>>> 50
>>>
>>>
>>> 5058 ^MPRVDRI-VFTTP-32:vol#show subsc
>>> 5059 ^MPRVDRI-VFTTP-32:vol#show subscribers
>>>
>>> �����ԣ������������������ʱ����ԥ��һ�£���ͷɾ���ˣ�������������
>>> � ����¼��־�ij���û����ת������ʵ�ļ�¼��������ļ������С�������
>>> ���ҡ�
>>>
>>> ��û�а취��vim�У���substitute�������е�^H���������ַ�ת�����Ⱥ�ɾ��
>>> һ���ַ�Ķ�����
>>>
>>> ���Ƴ�������־�еĻ���^M ��google�����۽϶ࣩ, ^G, ...
>> �ܲ��� vim ô�� ^M �Ļ�����ֱ���滻�ɿջ��� \r�������ϣ�����»��У���
>> ^G ��֪����ʲô��
>>
>
�ҵ��˽�������ķ�����
:g/^H/while getline('.') =~ '[^^H]^H' | s/[^^H]^H//g | endwhile

�Ҳ��ܲ����vim���ܵ�����ǿ�󡣡���

夏凯

unread,
Aug 29, 2012, 1:36:53 AM8/29/12
to ping, vim...@googlegroups.com
其实不用s/[^^H]^H//g,因为是从前往后的,不会出现看到两个^H^H,然后直接把这两个替换掉的情况,直接s/.^H//g就行了,前面也不用getline('.') =~ '[^^H]^H'
,直接getline('.') =~ '^H'就好了。
:g/^H/while getline('.') =~ '^H'| s/.^H//g | endwhile
还有一个问题,就是如果出现这种情况:
^MPRVDRI-VFTTP-32:vol#show ^H^H^H^H^H^H^H^H^H
就是我们经常会按住回退键,一直到清空所有东西,实际^H数目是远远大于前面的字符数的,这种情况不能把提示符删除吧,那这里就要判断下前面一个字符是否是提示符,这样就麻烦了。

On 2012年08月29日 11:35, ping wrote:
> On 8/28/2012 9:03 PM, 夏凯 wrote:
>> man ascii打开ascii表,然后找对应的行就行了,
>> ^G是第7个字符,所以对应07 BEL '\a' (bell)这行,
>> ^H是第8个字符,所以对应08 BS '\b' (backspace)这行,
>> ^I是第9个字符,所以对应09 HT '\t' (horizontal tab)这行,
>> ^J是第10个字符,所以对应0A LF '\n' (new line)这行,
>> ^M是第13个字符,所以对应0D CR '\r' (carriage ret)这行。
>> 其实^M的话,是回车,就像expect里面要send $passwd\r一样,这个要看你的程序
>> 怎么处理了。如果只是\r\n中的\r,直接删掉好了。
>> On 2012年08月29日 00:14, 依云 wrote:
>>> On Mon, Aug 27, 2012 at 09:47:11AM -0400, ping wrote:
>>>> 类似的问题一直困扰着我。
>>>> 打开一个log文件,
>>>>
>>>> PRVDRI-VFTTP-32:vol#show term len 50
>>>> PRVDRI-VFTTP-32:vol#show subsc
>>>> PRVDRI-VFTTP-32:vol#show subscribers
>>>>
>>>>
>>>> 注意上面的空格,因为email程序中不显示特殊字符。在我的vim中是如此显示的:
>>>>
>>>> 5057 ^MPRVDRI-VFTTP-32:vol#show ^H^H^H^H^H ^H^H^H^H^Hterm len
>>>> 50
>>>>
>>>>
>>>> 5058 ^MPRVDRI-VFTTP-32:vol#show subsc
>>>> 5059 ^MPRVDRI-VFTTP-32:vol#show subscribers
>>>>
>>>> 很明显,操作的人输入命令的时候,犹豫了一下,回头删除了,又输入了新命
>>>> 令。 但记录日志的程序没有做转换,忠实的记录所有输入的键盘序列。导致了
>>>> 混乱。
>>>>
>>>> 有没有办法在vim中,做substitute,把所有的^H这类特殊字符,转换成先后删除
>>>> 一个字符的动作?
>>>>
>>>> 类似出现在日志中的还有^M (google中讨论较多), ^G, ...
>>> 能不用 vim 么? ^M 的话可以直接替换成空或者 \r(如果你希望它导致换行)。
>>> ^G 不知道是什么。
>>>
> 找到了近乎完美的方法:
> :g/^H/while getline('.') =~ '[^^H]^H' | s/[^^H]^H//g | endwhile
>
> 我不能不佩服vim功能的灵活和强大。。。
>

Reply all
Reply to author
Forward
0 new messages