sed命令详解

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 print 打印输出到模式空间
P print 打印到第一个换行符
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空间

1571762888018

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
2
sed 'n;d' staff.csv       # 奇数行
sed '1d;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"