shell中的sed

中兴面试被提问到:在vim中删除包含特定字符串的行。当时说不会,后来想了想可以用sed或者perl里的匹配替换。

0. sed

sed是个管道命令,可以对数据进行替换、删除、新增、选取特定行等功能。

1. 命令格式

1
sed -ndfr [动作]

1.1 参数

参数
-n 只有被sed处理的行才会打印出来
-e 直接在命令行上输入sed命令,如果和-i参数配合用会保存源文件。
-f 将sed动作写在文件内,-f filename可以执行filename文件中的动作
-i 如果不加-i,sed的命令不会改变源文件,如果加上,会改变源文件

1.2 动作说明

1
[n1][,n2] function'

动作要写在单引号或双引号内;

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
sed -e "1,2d" a

输出:

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
sed -e "1,3c display" a
1
2
3
4
display
this 4 line
this 5 line
this 5 line

2.5 打印某些行 p——将某些行打印出,通常和-n一起用

只将1到3行打印出来

1
sed -d "1,3p" a
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会生成新的文件保存源文件内容。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!