sed介绍
sed是一种流编辑工具,流编辑工具就是把文本中的文字按照特定的分隔方式,进行数据流处理;
sed就是基于这种方式,它是以换行符以分隔单位,对文本进行逐行的处理。
sed命令格式
sed使用方式为: sed [选项] [动作] [inputfile]
选项
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑,即在同一行内执行多条命令,而不加-e则不可以。
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作。
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)。
-i :直接修改读取的文件内容,而不是输出到终端。
动作
- a :新增行, a 的后面可以是字串,而这些字串会在下一行添加。
- c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行。
- r :支持正则表达式,读取指定文件中的内容。
- = :打印行号。
- d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行。
- i :插入行, i 的后面可以接字串,而这些字串会在上一行添加。
- p :列印,将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行。
- s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行。
- w :将结果保存为文件。
一般动作的前面会有一个地址的限制,例如 [地址]function,表示我们的动作要操作的行。比如:sed -n "11d" test.txt
,中的11就是表示只对11行进行处理,处理动作是删除11行。
用法示例
输出指定行
输出指定行 | sed -n ‘p’ | 输出所有行 |
sed -n “2p” | 输出第二行 | |
sed -n “2,4p” | 输出第二到第四行 | |
sed -n “p;n” | 输出奇数行 | |
sed -n “n;p” | 输出偶数行 | |
sed -n ‘2,10{p;n}’ | 输出2-10行所有的奇数行 | |
sed -n ‘2,10{n;p}’ | 输出2-10行所有的偶数行 | |
sed -n 2,${n;p} | 输出2-10行所有的偶数行 | |
sed -n “2,+4p” | 从第2行开始,连续输出4行 | |
sed -n ‘/root/p’ | 输出所有含root字符串的行 | |
sed -n ‘/<root>/p’ | 匹配包含单个字符串是root的行 如 aroot 则不匹配 | |
sed -nr "/a | b/p" | |
sed -nr “/root/=” | 输出包含root的行号 |
插入指定行
插入指定行 | sed “/aa/a abd” | 在所有含aa的下一行插入一行abd |
sed “/aa/i abd” | 在所有含aa的上一行插入一行abd | |
sed “/aa/a abd\nccc” | 插入多行用\n来表示换行 | |
sed “1a ddd” | 在第一行后插入一行ddd | |
sed “2i ddd” | 在第一行前插入一行ddd |
删除指定行
删除指定行 | sed “2d” | 删除第二行 |
sed “1,3d” | 删除1-3行 | |
sed “/11/d” | 删除包含11的行 | |
sed “/1/d” | 删除小写字母开头的行 | |
sed ‘/.$/d’ | 删除以.结尾的行 | |
sed ‘/^$/d’ | 删除所有空行 |
替换指定内容
在使用 sed 命令进行替换操作时需要用到 s(字符串替换)、c(整行/整块替换)、y(字符转换)动作。
替换标记
在替换时,可以根据标记自定义替换的方式,主要有以下几种:
- 数字:如
s/a/b/2
将每行出现的第二个a替换成b。 - g:新字符串替换所有旧的地方。
字符替换
字符替换 | sed “s/t/T/” | 将每行第一个t替换为T,默认不写数字时为1 |
sed “s/t/T/2” | 将每行第2个t替换为T | |
sed “s/t/T/g” | 将每行所有的t替换成T | |
sed ‘s/o//g’ | 将每行所有的o替换为空串 | |
sed ‘s/^/#/’ | 在每行行首插入# | |
sed “/22/s/^/#/” | 在每个包含22的行首插入# | |
sed ‘3,5s/the/THE/g’ | 将3-5行的所有the替换成THE |
整行替换
sed “/22/c aaa” | 把含有22的行整行替换为aaa | |
sed “$c aaa” | 把最后一行替换为aaa | |
sed “3c hello” | 把第三行整体替换为hello | |
sed “/b$/c hello” | 以b结尾的行替换为hello | |
sed “/^1/c the” | 以1开头的行替换为the |
参考
a-z ↩︎