jck28-lucio-linux三剑客之sed

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 a:b:c | sed ‘s/:/123&/’(在:前面加上123)

a123:b:c

echo a:b:c | sed ‘s/:/&123/’

a:123b:c

echo a:b:c | sed ‘s#:#|#g’

a|b|c

[jck287213@shell.ceshiren.com tmp]$ echo a:b:c|sed ‘s/:/123&/’(在:前面添加123)

a123:b:c

[jck287213@shell.ceshiren.com tmp]$ echo a:b:c|sed ‘s/:/123&/g’(在全部:前面添加123)

a123:b123:c

[jck287213@shell.ceshiren.com tmp]$ echo a:b:c|sed ‘s/:/&123/g’(在全部:后面添加123)

a:123b:123c

[jck287213@shell.ceshiren.com tmp]$ echo a:b:c|sed ‘s/:/12&3/g’(在全部:后面添加12和3中间添加:)

a12:3b12:3c

[jck287213@shell.ceshiren.com tmp]$ echo a:b:c|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的数据)