Sed流式编辑器简称,主要用于定位和修改数据
## sed 基本语法与常用参数
-
语法结构 sed [addr]X[options]
-
-e 表达式
-
sed -n ‘2p’ 打印第二行
-
sed ‘s#hello#world#’ 修改
-
-i 直接修改源文件
-
-E 扩展表达式
-
–debug 调试
[jck287213@shell.ceshiren.com tmp]$ cat /tmp/1
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 21
c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com tmp]$ sed -n ‘1p’ /tmp/1(打印第1行)
a, 1, 10
[jck287213@shell.ceshiren.com tmp]$ sed -n ‘1,3p’ /tmp/1(展示1-3行)
a, 1, 10
a, 2, 20
a, 3, 30
## sed pattern 表达式
-
行数与行数范围 20 30,35
-
正则匹配 /pattern/
-
区间匹配 //,//
[jck287213@shell.ceshiren.com tmp]$ sed -n ‘/a/p’ /tmp/1 (展示包含a的行数)
a, 1, 10
a, 2, 20
a, 3, 30
[jck287213@shell.ceshiren.com tmp]$ sed -n ‘/c/p’ /tmp/1(展示包含c的行数)
c, 1, 21
c, 2, 31
c, 3, 31
## sed action 表达式
-
p 打印,通常结合-n 参数:sed -n ‘2p’
-
s 查找替换:s/REGEXP/REPLACEMENT/[FLAGS]
-
d 删除,删除前两行 sed ‘1,2d’
-
a 追加
-
c 改变
-
i 插入内容到匹配行之前
-
e 执行命令
-
分组匹配与字段提取:sed ‘s#([0-9])|([a-z])#\1 \2#’
## 行数操作
-
打印特定行
sed -n 2p
-
删除最后一行
sed $d
[jck287213@shell.ceshiren.com tmp]$ sed ‘1,3d’ /tmp/1(删除1-3行后展示))
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 21
c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com tmp]$ sed ‘$d’ /tmp/1(删除最后1行)
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 21
c, 2, 31
## s 表达式
-
s 表示替换
-
s 后面的追加字符可以为任意字符
-
g 表示全局匹配
-
& 表示匹配内容
echo ac | sed ‘s/:/123&/’(在:前面加上123)
a123c
echo ac | sed ‘s/:/&123/’
a:123b:c
echo ac | sed ‘s#:#|#g’
a|b|c
[jck287213@shell.ceshiren.com tmp]$ echo ac|sed ‘s/:/123&/’(在:前面添加123)
a123c
[jck287213@shell.ceshiren.com tmp]$ echo ac|sed ‘s/:/123&/g’(在全部:前面添加123)
a123:b123:c
[jck287213@shell.ceshiren.com tmp]$ echo ac|sed ‘s/:/&123/g’(在全部:后面添加123)
a:123b:123c
[jck287213@shell.ceshiren.com tmp]$ echo ac|sed ‘s/:/12&3/g’(在全部:后面添加12和3中间添加:)
a12:3b12:3c
[jck287213@shell.ceshiren.com tmp]$ echo ac|sed ‘s/:/|/g’
a|b|c
[jck287213@shell.ceshiren.com tmp]$ sed ‘s/a/great_a/’ /tmp/1(将a替换成成great_a(/可以是其他符号))
great_a, 1, 10
great_a, 2, 20
great_a, 3, 30
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 21
c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com tmp]$ cat /tmp/1
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 1
b, 2, 2
b, 3, 3
c, 1, 21
c, 2, 31
c, 3, 31
[jck287213@shell.ceshiren.com tmp]$ sed ‘s#1$#100#’ /tmp/1(所有以1结尾的内容替换成100)
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 100
b, 2, 2
b, 3, 3
c, 1, 2100
c, 2, 3100
c, 3, 3100
[jck287213@shell.ceshiren.com tmp]$ sed ‘s/1$/500/’ /tmp/1(所有以1结尾的内容替换成500)
a, 1, 10
a, 2, 20
a, 3, 30
b, 1, 500
b, 2, 2
b, 3, 3
c, 1, 2500
c, 2, 3500
c, 3, 3500
[jck287213@shell.ceshiren.com tmp]$ sed ‘s/1/9/’ /tmp/1(将第一个1替换成9)
a, 9, 10
a, 2, 20
a, 3, 30
b, 9, 1
b, 2, 2
b, 3, 3
c, 9, 21
c, 2, 39
c, 3, 39
[jck287213@shell.ceshiren.com tmp]$ sed ‘s/1/9/g’ /tmp/1(g将所有的1替换成9)
a, 9, 90
a, 2, 20
a, 3, 30
b, 9, 9
b, 2, 2
b, 3, 3
c, 9, 29
c, 2, 39
c, 3, 39
## 反向引用
-
使用()对数据进行分组
-
使用\1 \2 反向引用分组
echo 0 1 2 3 4 | sed -E ‘s#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#’
0 3 2 1 4
[jck287213@shell.ceshiren.com tmp]$ echo 0 1 2 3 4 | sed -E ‘s#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#’
0 3 2 1 4
([1-3]) ([1-3]) ([1-3])表示匹配到1-3的数据分组以空格分开
\3 \2 \1:\3表示匹配到的第3组数据 ,\2表示匹配到的第2组数据
[jck287213@shell.ceshiren.com tmp]$ echo abd | sed ‘/d/i 123’(在d前添加一行123的数据)
123
abd
[jck287213@shell.ceshiren.com tmp]$ echo abd | sed ‘/d/a 123’(在d后添加一行123的数据)
abd
123
[jck287213@shell.ceshiren.com tmp]$ echo abd | sed ‘/d/c 123’(在d一行数据替换成123的数据)