系统操作命令

sed命令

  1. 擅长对行进行操作处理
  2. 擅长将文件的内容信息进行修改调整/删除
  3. 命令的匹配参数使用''修饰而不使用""
  4. 插入文本或替换文本可以使用\n\t

sed.png

执行参数

  • -n : 取消默认输出
  • -e : 可以指定多个命令
  • -f : 指定命令文件
  • -i : 将输出写入到原文件
  • -r : 使用高级正则匹配
  • -i.bak : 复制文件,文件名添加.bak再将输出结果写入到原文件 (该参数和其他参数同时使用时,需要写在最后一位)

  • 注意 : 使用-ni参数时,n参数会取消默认输出,i参数只会将匹配操作以后输出的结果写入文件,如果不注意,可能结果会与预想的不同(输出结果即为写入文件内容)
[root@1997sty ~]# sed -ni '1c\100,oldgirl,UFO' person.txt
[root@1997sty ~]# cat person.txt
#可能预想结果
100,oldgirl,UFO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO

#实际运行结果
100,oldgirl,UFO

匹配参数

左侧参数

  • 2 : 匹配第二行
  • 2,5 : 匹配第二行到第五行
  • 2,$ : 匹配第二行到行尾
  • /{}/ : 正则匹配行,高级正则匹配需要-r参数 {}内为匹配内容
  • /{}/,/{}/ : 正则匹配左侧表达式的行到右侧表达式的行,左侧表达式匹配不到不匹配全部行,右侧表达式匹配不到则匹配剩余全部行,高级正则匹配需要-r参数 {}内为匹配内容

右侧参数

  • a\{} : 从匹配行之后插入内容,\一般情况下可以省略 {}内为插入内容
  • i\{} : 从匹配行之前插入内容,\一般情况下可以省略 {}内为插入内容
  • c\{} : 替换匹配行内容,\一般情况下可以省略 {}内为替换内容
  • d : 删除匹配内容
  • !d : 删除不匹配内容
  • p : 输出匹配内容
  • !p : 输出不匹配内容
  • ; : 在两条完整的匹配参数中间加入;来分隔
  • s/{}/{}/g : 全局匹配替换 {}内为匹配内容和替换内容
  • s#{}#{}#g : 全局匹配替换 {}内为匹配内容和替换内容

  • 测试文本
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO

新增操作

  • sed '1i\100,oldgirl,UFO' person.txt : 在文件第一行之前插入100,oldgirl,UFO
  • sed '$a\108,oldgirl,UFO' person.txt : 在文件尾行之后插入100,oldgirl,UFO
  • sed -e '/oldboy/i\oldgirl' -e '/oldboy/a\olddog' person.txt : 在匹配oldboy行之前插入oldgirl,在匹配oldboy行之后插入olddog,多个命令使用-e追加
[root@1997sty ~]# sed '1i\100,oldgirl,UFO' person.txt
100,oldgirl,UFO
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@1997sty ~]# sed '$a\108,oldgirl,UFO' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
108,oldgirl,UFO
[root@1997sty ~]# sed -e '/oldboy/i\oldgirl' -e '/oldboy/a\olddog' person.txt
oldgirl
101,oldboy,CEO
olddog
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
oldgirl
106,oldboy,CIO
olddog

删除操作

  • sed '3d' person.txt : 删除第三行内容
  • sed '2,6d' person.txt : 删除第二行到第六行内容
  • sed '/oldboy/d' person.txt : 删除匹配oldboy行内容
  • sed '3d;6d' person.txt : 删除第三行和第六行内容
  • sed '/zhaoyao/,/alex/d' person.txt : 删除匹配zhaoyao行到匹配alex行内容,可以多次匹配,如果匹配alex行不存在则输出剩余全部行
[root@1997sty ~]# sed '3d' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@1997sty ~]# sed '2,6d' person.txt
101,oldboy,CEO
[root@1997sty ~]# sed '/oldboy/d' person.txt
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@1997sty ~]# sed '3d;6d' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
104,yy,CFO
105,feixue,CIO
[root@1997sty ~]# sed '/zhaoyao/,/alex/d' person.txt
101,oldboy,CEO

修改操作

  • sed '1c\100,oldgirl,UFO' person.txt : 替换第一行内容为100,oldgirl,UFO
  • sed '2c\\n' person.txt : 替换第二行内容为\n
  • sed '2c\' person.txt : 删除第二行(如果替换内容为空则效果为删除,如果替换内容不为空则会追加\n)
  • sed 'c\' person.txt : 删除所有行(如果替换内容为空则效果为删除,如果替换内容不为空则会追加\n)
  • sed '1,3c\' person.txt : 删除第一行到第三行(如果替换内容为空则效果为删除,如果替换内容不为空则会追加\n)
  • sed 's/#o/?/g' person.txt : 匹配所有#o内容并将该内容替换为?
  • sed 's#o#?#g' person.txt : 匹配所有o内容并将该内容替换为?
  • sed 's#o#?#' person.txt : 匹配每行第一个o内容并将该内容替换为?
  • sed 's#o#?#' person.txt : 匹配每行第一个o内容并将该内容替换为?
  • sed -r 's/(.*),[a-zA-Z]+,[A-Z]+/&,\1/g' person.txt : 匹配所有(.*),[a-zA-Z]+,[A-Z]+内容并将该内容替换为&,\1 (&为所有匹配内容,\1为第一个()内容)
  • sed -i.bak 's#o#?#g' person.txt : 匹配所有o内容并将该内容替换为?,复制文件,文件名添加.bak再将输出写入到原文件
[root@1997sty ~]# sed '1c\100,oldgirl,UFO' person.txt
100,oldgirl,UFO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@1997sty ~]# sed '2c\\n' person.txt
101,oldboy,CEO


103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@1997sty ~]# sed '2c\' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@1997sty ~]# sed 'c\' person.txt
[root@1997sty ~]# sed '1,3c\' person.txt
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@1997sty ~]# sed 's/#o/?/g' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO
[root@1997sty ~]# sed 's#o#?#g' person.txt
101,?ldb?y,CEO
102,zha?ya?,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,?ldb?y,CIO
[root@1997sty ~]# sed 's#o#?#' person.txt
101,?ldboy,CEO
102,zha?yao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,?ldboy,CIO
[root@1997sty ~]# sed -r 's/(.*),[a-zA-Z]+,[A-Z]+/&,\1/g' person.txt
101,oldboy,CEO,101
102,zhaoyao,CTO,102
103,Alex,COO,103
104,yy,CFO,104
105,feixue,CIO,105
106,oldboy,CIO,106
[root@1997sty ~]# sed -i.bak 's#o#?#g' person.txt
[root@1997sty ~]# ls person.txt*
person.txt  person.txt.bak

查询操作

  • sed -n '3p' person.txt : 取消默认输出,输出第三行内容
  • sed -n '1,3p' person.txt : 取消默认输出,输出第一行到第三行内容
  • sed -n '1p;3p' person.txt : 取消默认输出,输出第一行和第三行内容
  • sed -n '/oldboy/p' person.txt : 取消默认输出,输出匹配oldboy行内容
  • sed -n '/oldboy/,/Alex/p' person.txt : 取消默认输出,匹配oldboy行到匹配Alex行内容,可以多次匹配,如果匹配Alex行不存在则输出剩余全部行
  • sed -n '/oldboy/p;/Alex/p' person.txt : 取消默认输出,匹配oldboy行和匹配Alex行内容
  • sed -n '1,3!p' person.txt : 取消默认输出,输出不是第一行到第三行内容
[root@1997sty ~]# sed -n '3p' person.txt
103,Alex,COO
[root@1997sty ~]# sed -n '1,3p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
[root@1997sty ~]# sed -n '1p;3p' person.txt
101,oldboy,CEO
103,Alex,COO
[root@1997sty ~]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
106,oldboy,CIO
[root@1997sty ~]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
106,oldboy,CIO
[root@1997sty ~]# sed -n '/oldboy/p;/Alex/p' person.txt
101,oldboy,CEO
103,Alex,COO
106,oldboy,CIO
[root@1997sty ~]# sed -n '1,3!p' person.txt
104,yy,CFO
105,feixue,CIO
106,oldboy,CIO