前言
每次看到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 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
追加内容
使用编辑命令 a
,可以向匹配行后面插入内容。
- 在第2行后面添加文本
newline
,命令为sed '2anewline' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
- 在最后一行后面添加文本
endline
,命令为sed '$aendline' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
插入内容
使用编辑命令 i
,可以在匹配的那一行插入内容。
- 在第1行插入文本
firstline
,命令为sed '1ifirstline' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
- 在包含文本 “123” 的行插入文本
insertline
,命令为sed '/123/iinsertline' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
更改行内容
使用编辑命令 c
,可以修改匹配行的内容。
- 将包含文本 “123” 的行替换为 “456”,命令为
sed '/123/c456' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
- 将3、4、5行内容更改为newworld,命令为
sed '3,5cneworld' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
替换行内容
使用编辑命令 s
,可以替换匹配行的内容,需要注意和 c
的区别,c
是整行的内容都改变,而 s
是只替换命令中指定的部分。
- 将文件中的文本 “123” 替换为 “456”,命令为
sed 's/123/456/g' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
综合运用
- 删除空行并给所有内容是 “123” 的文本加上小括号
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
删除内容
使用编辑命令 c
,可以删除匹配行。
- 删除空行,命令为
sed '/^$/d' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
- 从第一行开始,每两行删除掉一行,命令为
sed '1~2d' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
- 删除2行和3行以外的行,命令为
sed '2,3!d' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
- 删除指定行数范围内的匹配行,命令为
sed '1,3{/123/d}' data.txt
1 | albert@DESKTOP-6746UC3:/mnt/d/data/shell$ cat data.txt |
总结
sed
是 stream editor 的缩写,表示为面向字符流的编辑器sed
命令常用的几个选项,-e
、-f
、-i
、-n
sed
命令常用的几个编辑动作,也就是选项后的常用命令有p(打印)
、a(追加)
、i(插入)
、c(改变)
、s(替换)
、d(删除)
不能打败我的困难终将使我更加强大,绊不倒我的石头最后只会被拿来踩踏,拥抱一个个困难,生活本来就是一条打怪升级之路,那有什么一帆风顺~
2020-11-7 22:47:01