中兴面试被提问到:在vim中删除包含特定字符串的行。当时说不会,后来想了想可以用sed或者perl里的匹配替换。
0. sed
sed是个管道命令,可以对数据进行替换、删除、新增、选取特定行等功能。
1. 命令格式
1.1 参数
参数 |
|
-n |
只有被sed处理的行才会打印出来 |
-e |
直接在命令行上输入sed命令,如果和-i参数配合用会保存源文件。 |
-f |
将sed动作写在文件内,-f filename可以执行filename文件中的动作 |
-i |
如果不加-i,sed的命令不会改变源文件,如果加上,会改变源文件 |
1.2 动作说明
动作要写在单引号或双引号内;
n1,n2可以没有,他们代表动作在哪些行进行,如果是”2,5”表示动作在第二行到第五行之间进行。
function |
|
d |
删除这些行 |
a |
新增,插入在行之后 |
i |
插入,插入在行之前 |
c |
行替换 |
p |
将某些行打印出,通常和-n一起用 |
s |
替换,可以进行正则匹配 |
2. 使用sed
存在文件a,内容如下
1 2 3 4 5 6
| this 1 line this 2 line this 3 line this 4 line this 5 line this 5 line
|
2.1 删除 d ——删除这些行
删除1到2行
输出:
1 2 3 4
| this 3 line this 4 line this 5 line this 5 line
|
2.2 新增 a——插入在行之后
分别在1到3行后插入一行
1
| sed -e "1,3a after line" a
|
1 2 3 4 5 6 7 8 9
| this 1 line after line this 2 line after line this 3 line after line this 4 line this 5 line this 5 line
|
2.3 插入 i——插入在行之前
1
| sed -e "1,3i before line" a
|
1 2 3 4 5 6 7 8 9
| before line this 1 line before line this 2 line before line this 3 line this 4 line this 5 line this 5 line
|
2.4 行替换 c
1 2 3 4
| display this 4 line this 5 line this 5 line
|
2.5 打印某些行 p——将某些行打印出,通常和-n一起用
只将1到3行打印出来
1 2 3
| this 1 line this 2 line this 3 line
|
2.6 正则匹配替换 s
将所有的this替换成大写THIS
1
| sed -e "s/this/THIS/g" a
|
1 2 3 4 5 6
| THIS 1 line THIS 2 line THIS 3 line THIS 4 line THIS 5 line THIS 5 line
|
3. 使用sed修改文件内容
上面讲的用法,sed不会改变源文件。如果想要改变源文件就要加-i参数
1
| sed -ie "s/this/THIS/g" a
|
a文件变成:
1 2 3 4 5 6
| THIS 1 line THIS 2 line THIS 3 line THIS 4 line THIS 5 line THIS 5 line
|
并且生成了一个文件ae,其中保存原来的a文件的内容,如果不加-e参数,则不生成这个文件,只修改a的内容。
-i也可以与其他的动作d\a等等用,用法一样,只是会改变源文件。
如果同时用-ie会生成新的文件保存源文件内容。