系统操作命令
sed
命令
- 擅长对行进行操作处理
- 擅长将文件的内容信息进行修改调整/删除
- 命令的匹配参数使用
''
修饰而不使用""
- 插入文本或替换文本可以使用
\n
和\t
执行参数
- -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
最后一次更新于2019-11-29 19:51
0 条评论