[译]Unix sed实用教程第五篇–替换文件内容续

前面已经学习过替换文件内容了,本文我们学习一些更频繁使用的搜索替换操作.

示例文件使用:

$ cat file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
1.替换每行开始的两个字母,这里用XX来替换
$ sed ’s/^../XX/’ file
XX01:EMP1:25:2500
XX02:EMP2:26:2650
XX03:EMP3:24:3500
XX04:EMP4:27:2900
s代表substitute,前面说过了,^用来匹配行开头,.表示任意一个字符,两个..就是你懂的,

其实,不要^符号也是可以的,因为默认就是从开头开始匹配,如下也可以实现

sed ’s/../XX/’ file
2.删除每行开头的两个字符
$ sed ’s/^..//’ file
01:EMP1:25:2500
02:EMP2:26:2650
03:EMP3:24:3500
04:EMP4:27:2900
看到没有,后两个斜线之间没有内容,也就是用空字符来替换开头的两个字符,就实现了删除

3.要是想删除每行最后的两个字符呢

$ sed ’s/..$//’ file
RE01:EMP1:25:25
RE02:EMP2:26:26
RE03:EMP3:24:35
RE04:EMP4:27:29
再次强调,$在不同的情况下表示不同的意思,这里匹配行尾,有时候也匹配文件尾部

4.向每行末尾添加内容

$ sed ’s/$/.Rs/’ file
RE01:EMP1:25:2500.Rs
RE02:EMP2:26:2650.Rs
RE03:EMP3:24:3500.Rs
RE04:EMP4:27:2900.Rs
这里,先匹配行尾,然后把”.Rs”添加到行尾

5.在每行开头添加空格

$ sed ’s/^/   /’ file
   RE01:EMP1:25:Rs.2500
   RE02:EMP2:26:Rs.2650
   RE03:EMP3:24:Rs.3500
   RE04:EMP4:27:Rs.2900
还记得前面说过的么,sed默认不影响原始文件,要是想更新原始文件,请加-i参数
$ sed -i ’s/^/   /’ file
$ cat file
   RE01:EMP1:25:Rs.2500
   RE02:EMP2:26:Rs.2650
   RE03:EMP3:24:Rs.3500
   RE04:EMP4:27:Rs.2900
6.移除开始的空格
$ sed ’s/^ *//’ file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
^匹配行首,然后是一个空格,然后是*,表示一个或多个空格嘛,然后替换为空字符

7.移除行首和行尾的空格

$ sed ’s/^ *//; s/ *$//’ file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
不要怕,从分号处分开,就是两条命令啦,一个做行首的,一个做行尾的,前面说过的,可以使用-e参数来分开
sed -e ’s/^ *//’ -e ’s/ $//’ file
8.如何在一个字符串前后添加一些其他字符呢,可以用来字符串转义
$ sed ’s/./”&”/’ file
“RE01:EMP1:25:Rs.2500”
“RE02:EMP2:26:Rs.2650”
“RE03:EMP3:24:Rs.3500”
“RE04:EMP4:27:Rs.2900”
前两个斜线匹配了所有字符,也就是本行,然后后面两个斜线是替换的内容,注意里面的&符号,之前也说过的,表示匹配到的字符,也就是本行了。所有就这样啦

9.移除行首和行尾的一个字符(多个你也会的啦)

$ sed ’s/^.//;s/.$//’ file
RE01:EMP1:25:2500
RE02:EMP2:26:2650
RE03:EMP3:24:3500
RE04:EMP4:27:2900
分开看看,你可以的

10.删除第一个数字之前的所有字符

$ sed ’s/^[^0-9]//’ file
01:EMP1:25:2500
02:EMP2:26:2650
03:EMP3:24:3500
04:EMP4:27:2900
这条命令略复杂,请先回头看一下我们的示例文件,然后我们开始分析这个表达式,地一个^表示匹配行首,然后[^0-9] 是一个典型的正则,匹配非数字的多个字符,简单说一下[0-9]表示匹配0,1,2,3,4,5,6,7,8,9任意一个字符,前面加个一个^,表示非,也就是不匹配这些数字,然后最后是一个*,表示匹配非数字的连续多个字符,有机会的话我会推荐一个正则系列,或者自己写一篇文章。这里就先这样理解吧。

那猜猜这个是干嘛的

sed ’s/^[^a-zA-Z]*//’ file
是的,你猜对了,删除开头的所有非字母字符。

11.删除行尾的数字

$ sed ’s/[0-9]*$//’ file
RE01:EMP1:25:
RE02:EMP2:26:
RE03:EMP3:24:
RE04:EMP4:27:
看看前面的你就知道了

12.通过分隔符得到文件最后一列

$ sed ’s/.://’ file
2500
2650
3500
2900
可能你你预想的不一样,是不是,你可能认为会是第一列被删除,其他的列都在,不对的,sed是很贪心的,当我们指定’.:‘时,他会一直向后查找,尽量匹配更多,所以,就匹配到最后一个列之前了

13.转换整行字符为小写

$ sed ’s/.*/\L&/’ file
re01:emp1:25:rs.2500
re02:emp2:26:rs.2650
re03:emp3:24:rs.3500
re04:emp4:27:rs.2900
\L是sed的一个命令,Lowercase嘛。\L之后的内容被毁转换,而&表示前面匹配道德内容,所以就实现了转换

14.转换大写

\U你懂的,Uppercase

$ sed ’s/.*/\U&/’ file
RE01:EMP1:25:RS.2500
RE02:EMP2:26:RS.2650
RE03:EMP3:24:RS.3500
RE04:EMP4:27:RS.2900

linux  shell 
comments powered by Disqus