在Linux
中有关sed
的命令;
说到sed命令,就不得不sed
,awk
,grep
三个命令,很多时候这三个命令是一同出现的;
对三者进行一个总结:
- sed:常用来做行数据增删改查
- awk:常用来做列数据切分与提取
- grep:常用来做全局数据的查询定位
sed命令作用:
- 对Linux中的文本文件进行逐行读取,读到匹配的行按照既定的规则进行处理
语法介绍
代码语言:javascript复制sed [选项] [编辑命令] [文件]
常用选项包括:
代码语言:javascript复制 -e :直接在命令行模式上进行sed动作编辑,此为默认选项;
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容;
-n :只打印模式匹配的行;
-r :支持扩展表达式;
常用编辑包括:
代码语言:javascript复制a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(下一行);
c :取代, c 的后面可以接字串,整行替换;
d :删除,删除指定行delete,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(上一行);
p :打印,亦即将某个选择的数据印出,和-n一起使用;
s :取代,字符串替换,通常这个 s 的动作可以搭配正规表示法;
g :全局,如果不使用 g 标记,sed 的替换命令只会替换每一行中的第一个匹配项。当使用 g 时,它会替换行中的所有匹配项;
sed实战:
- 查询(p/n命令)
cat 1.txt
1
2
3
4
5
6
7
8
9
10
// 查询第8行数据
sed '8p' 1.txt ('8p'表示打印第8行,默认除了打印第8行外,还会打印文本所有数据)
1
2
3
4
5
6
7
8
8
9
10
// 只查询第8行数据
sed -n '8p' 1.txt ('-n,8p'表示只查询第8行数据)
8
// 只查询第2~5行数据
sed -n '2,5p' 1.txt ('2,5p'表示第2~5行)
2
3
4
5
// 只查询第2行、第5行数据
sed -n '2p;5p' 1.txt ('2p;5p'表示第2行、第5行)
2
5
// 只查询第2行以及后3行数据
sed -n '2, 3p' 1.txt ('2 3p'表示第2行以及后3行)
2
3
4
5
// 只显示最后一行
sed -n '$p' 1.txt ('$'表示最后一行)
10
// 只显示1开头的行
sed -n '/^1/p' 1.txt ('^1'表示1开头)
1
10
// 从第1行开始,每隔2行输出
sed -n '1~2p' 1.txt
1
3
5
7
9
- 取代 (s命令)
cat 1.txt
111
221
331
441
551
1001
// 每行行首添加#符号
sed -n 's/^/#/p' 1.txt = sed 's/^/#/' 1.txt ('^'表示行首)
#111
#221
#331
#441
#551
#1001
// 1~3行行首添加#符号
sed -n '1,3s/^/#/p' 1.txt
#111
#221
#331
// 行尾添加!符号
sed -n 's/$/!/p' 1.txt = sed 's/$/!/' 1.txt ('$'表示行尾)
111!
221!
331!
441!
551!
1001!
// 每行中第一次出现的1替换为a
sed 's/1/a/' 1.txt
a11
22a
33a
44a
55a
a001
// 每行中的1都替换为a
sed 's/1/a/g' 1.txt ('g'表示全局匹配)
aaa
22a
33a
44a
55a
a00a
// 将第2行改成'22222221'
sed '2s/.*/22222221/g' 1.txt ('.*'表示该行所有内容)
111
22222221
331
441
551
1001
cat 1.txt
1 a
12 b
6 c
5 d
// 删除所有空格
sed 's/ //g' 1.txt (' '表示多个空格,在正则表达式中,' '通常用来表示一个或多个匹配。如果不加'/g'则只删第一个匹配到的空格)
1a
12b
6c
5d
// 删除每行行首的空格
sed 's/^ //' 1.txt ('^ ')
1 a
12 b
6 c
5 d
// 删除每行行尾的空格
sed 's/ $//' 1.txt
// 将多个空格替换为单个空格 (sort排序前的操作,为了保证sort排序,还要去除每行首行的空格)
sed 's/ / /' 1.txt
1 a
12 b
6 c
5 d
cat 1.txt
/666
/234
?13
!21
// 将'/666'替换为'666'
sed 's//123/\666/g' 1.txt (''表示定界符)
666
/234
?13
!21
- 插入(i/a命令)
cat 1.txt
apple
orange
banana
// 在第二行前插入tomato
sed '2itomato' 1.txt (''用于指示换行)
apple
tomato
orange
banana
// 在第二行前插入多行数据
sed '2i
a
b
c' 1.txt
apple
a
b
c
orange
banana
// 在第二行后插入tomato
sed '2atomato' 1.txt (''用于指示换行)
apple
orange
tomato
banana
// 在第二行后插入多行数据
sed '2a
a
b
c' 1.txt
apple
orange
a
b
c
banana
// 在最后一行后插入数据
sed '$atomato' 1.txt
apple
orange
banana
tomato
- 插入(d命令)
cat 1.txt
apple
orange
banana
//删除第2行数据
sed '2d' 1.txt
apple
banana
//删除含有ap数据
sed '/ap/d' 1.txt = grep -v 'ap' 1.txt
orange
banana
cat 1.txt
apple
orange
banana
//删除空行
sed '/^$/d' 1.txt
apple
orange
banana