sed命令详解
sed 是Stream EDitor的缩写,是一款古老的流编辑器,与之相对应的是交互式编辑器(如vim);流编辑器是按行读取的也称为行编辑器(sed, awk),相对应的概念是全文本编辑器。
sed参数解释
sed常用的参数:
| 参数 | 英文 | 解释 |
|---|---|---|
| -n | quiet | 抑制模式空间的自动输出 |
| -e | script | 增加执行脚本 |
| -f | script_file | 执行脚本从文件中读取 |
| -i | in-place | 替换原文件 |
| -r | regexp | 支持正则 |
sed脚本命令解释
| 参数 | 英文 | 解释 |
|---|---|---|
| s | search | 查找 |
| g | global | 全局替换 |
| p | 打印输出到模式空间 | |
| P | 打印到第一个换行符 | |
| i | insert | 插入 |
| a | append | 附加文本 |
| d | delete | 删除模式空间 |
| D | delete | 如果模式空间为空读取新的一行,如果不为空则删除第一行,不读下一行,直接进入下一个循环。 |
| h/H | hold | 将模式空间内容输出到保持空间 |
| g/G | get | 将保持空间内容返回模式空间,大写G追加;小写g覆盖。 |
| x | exchange | 交换模式空间与保持空间 |
| n | next | 读取下一行到模式空间,覆盖模式 |
| N | next | 读取下一行到模式空间,追加模式 |
sed搜索命令
| 命令示例 | 解释 |
|---|---|
s/old/new/ |
只匹配每一行第一个,做替换 |
s/old/new/g |
全局替换 |
s/old/new/2 |
匹配每一行第二次出现的字符,做替换 |
-n 's/old/new/p' |
替换成功的行打印输出 |
/正表达式/s/old/new/g |
复合正则表达式的行替换 |
行号s/old/new/ |
指定行的替换 |
1,$s/old/new/ |
第一行到最后一行的搜索替换 |
/正则表达式/1,$s/old/new/ |
第一行到最后一行满足正则表达式的替换 |
-r 's/(a.*b)'/\1:\1 |
引用分组与回调 |
sed空间

sed多行模式
1 | sed 'N; s/old/new/; P; D' file |
每次处理 1,2行,2,3行…
1 | sed 'N; N; s/old/new/; P; D' file |
每次处理 123行,234行…
sed命令示例
查看奇/偶数行
1 | sed 'n;d' staff.csv # 奇数行 |
第一条命令中的n;表示输出当前行并立即读取下一行。第二条命令先把第一行记录删除,于是再输出的奇数行就自然变成原来的偶数行了。
从单行中查找
比如想从I am 18 years old里查找18这个年龄,可以这么做:
1 | echo "I am 18 years old" | sed -n "s/I am \(.*\) years old/\1/p" |
这里\1代表第一个被匹配上的内容也就是\(.*\)。发挥想象力:
1 | echo "I am 18 years old" | sed -n "s/I am \(.*\) \(.*\) old/\2: \1/p" |