linux环境下sed命令的基础用法

前言

每次看到sed这个词就想起“种子”,心里明知道是把它和seed弄混了,但是先入为主的思想怕是改不过来了,不过现在还好,虽然把第一印象的意思弄错了,但还是很快能反应过来这是一个很“厉害”的linux命令,也有一些网友评论到,每次看到这个命令就双腿发抖,我虽然没抖,但是谈到这个命令还是有些挠头,心里有些发怵。

一味地逃避困难是不可取的,虽然心里感觉这是个很难的命令,但是今天还是要硬着头皮学一下,边学边记录,易于下次复习,那些打败不了我的困难终将使我更加强大。

sed功能

其实sed并不是一个单词,而是 stream editor 的缩写,本意为面向字符流的编辑器,说白了sed就是用来编辑文件的命令,编辑文件是我们每天经常做的工作,但是如果每天的编辑工作都类似,我们就要考虑使用sed工具来提高工作效率了,比如说把今天新增的100个文件的第一行都加上版本信息,虽然手动编辑也能做,但是你想体验一下敲个命令瞬间搞定这件事情的快感吗,我们来学习sed命令吧?

命令格式

1
sed [OPTION]... {script-only-if-no-other-script} [input-file]

sed 的选项不是太多,最常用的有下面两种形式:

  • sed -e 'sed命令脚本' input-file
  • sed -f 'sed命令脚本文件' input-file

命令选项

  • -e :命令行模式,选项后直接跟sed编辑脚本,在只有一组脚本的情况下可以省略
  • -f :脚本文件模式,选项后跟写有sed编辑脚本的文件名,运行后会执行脚本文件内的编辑动作
  • -i :直接修改文件内容,如果不加这个选项是不修改源文件的,只将修改后的文件输出
  • -n :只打印模式匹配的行,便于查看所作修改

以上列举只是一些常见选项,还有些比如 -l 指定每行长度,-s 指定换行的分隔符等等,用到了再来分析学习。

寻找匹配

既然是编辑文件,首先要找到需要编辑的位置,在sed命令中可以使用行号,或者字符查找等方式找到需要修改的位置,然后再执行编辑动作,常见的范围:

  • x:指定的行号,表示第x行
  • x,y:指定的行号范围,表示第x行到y行
  • /pattern:查询到包含指定模式的行
  • x,y!:指定的行号范围,表示不包括第x行到y行

sed操作

sed几乎可以实现文件的所有编辑工作,接下来尝试一些常见的用法:

打印内容

使用编辑命令 p,可以向匹配行后面插入内容。

  • 打印文件第2行和第3行的内容,命令为sed -n '2,3p' data.txt
1
2
3
4
5
6
7
8
9
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed -n '2,3p' data.txt
abc
xyz

追加内容

使用编辑命令 a,可以向匹配行后面插入内容。

  • 在第2行后面添加文本newline,命令为sed '2anewline' data.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '2anewline' data.txt
1234
abc
newline
xyz
1==
123
  • 在最后一行后面添加文本endline,命令为sed '$aendline' data.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '$aendline' data.txt
1234
abc
xyz
1==
123
endline
albert@DESKTOP-6746UC3:/mnt/d/data/shell$

插入内容

使用编辑命令 i,可以在匹配的那一行插入内容。

  • 在第1行插入文本firstline,命令为sed '1ifirstline' data.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '1ifirstline' data.txt
firstline
1234
abc
xyz
1==
123
  • 在包含文本 “123” 的行插入文本insertline,命令为sed '/123/iinsertline' data.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '/123/iinsertline' data.txt
insertline
1234
abc
xyz
1==
insertline
123

更改行内容

使用编辑命令 c,可以修改匹配行的内容。

  • 将包含文本 “123” 的行替换为 “456”,命令为sed '/123/c456' data.txt
1
2
3
4
5
6
7
8
9
10
11
12
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '/123/c456' data.txt
456
abc
xyz
1==
456
  • 将3、4、5行内容更改为newworld,命令为sed '3,5cneworld' data.txt
1
2
3
4
5
6
7
8
9
10
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '3,5cneworld' data.txt
1234
abc
neworld

替换行内容

使用编辑命令 s,可以替换匹配行的内容,需要注意和 c 的区别,c 是整行的内容都改变,而 s 是只替换命令中指定的部分。

  • 将文件中的文本 “123” 替换为 “456”,命令为sed 's/123/456/g' data.txt
1
2
3
4
5
6
7
8
9
10
11
12
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed 's/123/456/g' data.txt
4564
abc
xyz
1==
456

综合运用

  • 删除空行并给所有内容是 “123” 的文本加上小括号
1
2
3
4
5
6
7
8
9
10
11
12
13
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz

1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed -e 's/123/(&)/g' -e '/^$/d' data.txt
(123)4
abc
xyz
1==
(123)

删除内容

使用编辑命令 c,可以删除匹配行。

  • 删除空行,命令为sed '/^$/d' data.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234

abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '/^$/d' data.txt
1234
abc
xyz
1==
123
  • 从第一行开始,每两行删除掉一行,命令为sed '1~2d' data.txt
1
2
3
4
5
6
7
8
9
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '1~2d' data.txt
abc
1==
  • 删除2行和3行以外的行,命令为sed '2,3!d' data.txt
1
2
3
4
5
6
7
8
9
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '2,3!d' data.txt
abc
xyz
  • 删除指定行数范围内的匹配行,命令为sed '1,3{/123/d}' data.txt
1
2
3
4
5
6
7
8
9
10
11
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt
1234
abc
xyz
1==
123
albert@DESKTOP-6746UC3:/mnt/d/data/shell$ sed '1,3{/123/d}' data.txt
abc
xyz
1==
123

总结

  • sed 是 stream editor 的缩写,表示为面向字符流的编辑器
  • sed 命令常用的几个选项,-e-f-i-n
  • sed 命令常用的几个编辑动作,也就是选项后的常用命令有 p(打印)a(追加)i(插入)c(改变)s(替换)d(删除)

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

不能打败我的困难终将使我更加强大,绊不倒我的石头最后只会被拿来踩踏,拥抱一个个困难,生活本来就是一条打怪升级之路,那有什么一帆风顺~

2020-11-7 22:47:01

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客