vi/vim查看空格、制表符等特殊符号

一、背景

在对CTI服务器上的phone_roa_seg.ini文件的号段信息进行更新时。之前都是直接在VI里进行编缉添加的,不过后来发现里面有一些重复的和错误的数据。所以决定从数据库提了下最新的号段的信息对该文件进行更改。于是先用pl/sql 查出结果后,导出为excel里,再由excel中复制到UE中,最后粘到linux文件里。不过更新完后两天,就收到客户大量的投诉信息。提示业务在使用中对固化(不加区号)进行拨打时会转到杭州的号段上。也就是说系统自动给固化呼叫加上了0571的区号。于是就想到了修改的文件上。后来通过使用文件比对发现两个文件不一样。乍一看和改之前的文件并没有什么区别。

后来在十六进制下比对发现:空格符为十六进制下的20,而excle中的制表空格符为19。找到了问题,重新更改,业务进程重新加载后,问题解决。

phone_roa_seg.ini文件格式如下:

 
  1. 1342900 0579
  2. 1342901 0579
  3. 1342902 0579
  4. 1342910 0571
  5. 1342911 0571
  6. 1342915 0571
  7. 1342916 0571
  8. 1342917 0571

二、解决方法

PL/sql导出结果为TSV文件,然后UE编缉,点选“将制表符更换为空格”,OK,完成收工。

后来又想了下,在linux vi下应该也能实现修改。vi删除多余空格:

 

 
  1. 行末:$
  2. 行首:^
  3. 空格:\s
  4. 行末空格:\s+$
  5. 行首空格:^+\s

 

有些人认为行末的空格是无用,浪费而难看的。要删除这些每行后面多余的空格,可以执行如下命令:

 
  1. :%s/\s+$//g

命令前面指明范围是 "%",所以这会作用于整个文件。"substitute" 命令的匹配模式是"\s+$"。这表示行末($)前的一个或者多个(+)空格(s)。后面我们会介绍怎样写这样的模式。替换命令的 "to" 部分是空的:"//"。这样就会删除那些匹配的空白字符。另一种没有用的空格是 Tab 前面的字符。通常这可以删除而不影响格式。但并不是总这样!所以,你最好手工删除它。执行如下命令:

你什么都看不见,其实这是一个空格加一个 TAB 键。相当于 "/<Space><Tab>"。现在,你可以用 "x" 删除多余的空格,并保证格式没有改变。接着你可以用 "n" 找到下一个位置并重复这个操作。命令小结:

:set fileformat设置文件格式
:set endofline设置文件结束符
:set noendofline取消文件结束符
:set list进入List Mode
:set nolist退出List Mode
:%s/n//g删除换行符
:set textwidth设置行宽
:set textwidth设置行边距
:join合并多行
J合并两行

此外,关于ASCII字符,Linux下面有个简要的介绍:man ascii 

^M 是ascii中的'r'回车符,是16进制的0x0D,8进制的015,十进制的13;

对于换行这个动作,unix下一般只有一个0x0A表示换行
windows下一般都是0x0D和0x0A两个字符。
^L 是ascii 0x0C 'f', 换页控制符 。

三、如何消除vi中的^M

我刚开始去用sed命令: 

 
  1. sed 's/^M//g' file_old > file_new

执行后查看不成功,输出的文件,用vi打开,还是带^M。
后来到网上搜到了可以用的办法,用tr命令:

 
  1. tr -d "15" < myfile.txt > myfile_new.txt

可以把符号^M(即"15")去掉,并另存为新文件myfile_new.txt 。

四、vim显示空格、tab字符及多行注释 

1、显示 TAB 键 

文件中有 TAB 键的时候,你是看不见的。要把它显示出来:

 
  1. :set list TAB

显示为 ^I,$显示在每行的结尾,表示换行,Vim 可以用高亮显示空格和TAB。 

2、vim 的搜索及替换 

如果没有指定范围,则只在当前行进行搜索替换。
在所有行进行搜索替换。范围符号%表示在所有行进行搜索替换。

 
  1. :%s/from/to/

就是在全文查找from并替换为to。
在指定的行上进行搜索替换。

 
  1. :1,50s/from/to/

表示在第1行和第50行之间(包括1和50行)进行搜索和替换。

 
  1. :45s/from/to/

表示仅仅在第45行进行搜索和替换。而"1,$"行号范围和“%“是等价的。

3、Vim多行缩进技巧 

关键字: vim indent
按v进入visual状态,选择多行,用>或<缩进或缩出
通常根据语言特征使用自动缩进排版:

在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format。

使用gg=G可对整篇代码进行排版。 

vim 多行注释

 

 
  1. :20,30 s/^/#/g 第20到30行用 # 注释掉。
  2. :20,30 s/^#//g 取消注释
  3. :4,10 s/^[^I ]+// 去掉行首的空白字符 用 . 表示当前行。
  4. :.,30 s/^/#/g 可以看到 vim 命令针对当前行,在前面加个范围就可以针对多行。
  5. :co 12 把当前行 copy 到行 12 的地方。

 

总结:以后在使用UE编缉此类文件时,自动点选上“显示空格和制表符”及“显示行结尾”。

转载:http://www.361way.com/vi-char/362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值