Linux中sed命令简单介绍

2024-04-02 17:29:41 浏览数 (1)

Linux中有关sed的命令;

说到sed命令,就不得不sedawkgrep三个命令,很多时候这三个命令是一同出现的;

对三者进行一个总结:

  • 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命令)
代码语言:javascript复制
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命令)
代码语言:javascript复制
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命令)
代码语言:javascript复制
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命令)
代码语言:javascript复制
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

0 人点赞