sed的基本用法

Sed 基本语法

sed [options] {sed-commands} {input-file}

Sed 脚本执行流程

Sed 脚本执行遵从下面简单易记的顺序:Read,Execute,Print,Repeat(读取,执行,打印,重复), 简称 REPR
分析脚本执行顺序:

1.读取一行到模式空间(sed 内部的一个临时缓存,用于存放读取到的内容) 
2.在模式空间中执行命令。如果使用了{ } 或 –e 指定了多个命令,sed 将依次执行每 个命令 
3.打印模式空间的内容,然后清空模式空间 
4.重复上述过程,直到文件结束

打印模式空间(命令 p)

使用命令 p,可以打印当前模式空间的内容
-n 屏蔽默认输出

不加  -n 参数 每行会输出两次
[root@localhost sed]# sed 'p' employee.txt
101,John Doe,CEO
101,John Doe,CEO
102,Jason Smith,IT Manager
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
105,Jane Miller,Sales Manager

只打印一行

[root@localhost sed]# sed -n 'p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

指定地址范围
只打印第 2 行:

[root@localhost sed]# sed -n '2p' employee.txt
102,Jason Smith,IT Manager

打印第 1 至第 4 行:

[root@localhost sed]# sed -n '1,4p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer

打印第 3行至最后一行($代表最后一行):

[root@localhost sed]# sed -n '3,$p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

修改地址范围

加号+配合逗号使用,可以指定相的若干行,而不是绝对的几行。如 n,+m 表示从第 n 行开 始后的 m 行
波浪号~也可以指定地址范围。它指定每次要跳过的行数。如 n~m 表示从第 n 行开始,每次 跳过 m 行:
1~2 匹配 1,3,5,7,……
2~2 匹配 2,4,6,8,……
1~3 匹配 1,4,7,10,……
2~3 匹配 2,5,8,11,……
只打印奇数行:

[root@localhost sed]# sed -n '1~2 p' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager

模式匹配
eg:
打印匹配模式”Jane”的行:

[root@localhost sed]# sed -n '/Jane/ p' employee.txt
105,Jane Miller,Sales Manager

打印第一次匹配 Jason 的行至第 4 行的内容:

[root@localhost sed]# sed -n '/Jason/,4p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer

删除行

命令 d 用来删除行,需要注意的是它只删除模式空间的内容,和其他 sed 命令一样,命令 d 不会修改原始文件的内容

如果不提供地址范围,sed 默认匹配所有行,所以下面的例子什么都不会输出,因为它匹配 了所有行并删除了它们:

[root@localhost sed]# sed 'd' employee.txt
[root@localhost sed]#

只删除第 2 行:

[root@localhost sed]#  sed '2 d' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

删除第 1 至第 4 行:

[root@localhost sed]# sed '1,4 d' employee.txt
105,Jane Miller,Sales Manager

删除第 2 行至最后一行:

[root@localhost sed]# sed '2,$ d' employee.txt
101,John Doe,CEO

相信大家已经知道后面的删除了,基本和上面的匹配一样。
。。。。。。

常用的删除命令示例:
删除所有空行
[root@localhost sed]# sed ‘/^$/ d’ employee.txt
删除所有注释行(假定注释行以#开头)

 [root@localhost sed]# sed '/^#/ d' employee.txt

把模式空间内容写到文件中(w 命令)

命令 w 可以把当前模式空间的内容保存到文件中。默认情况下模式空间的内容每次都会打 印到标准输出,如果要把输出保存到文件同时不显示到屏幕上,还需要使用-n 选项。

把 employee.txt 的内容保存到文件 output.txt,同时显示在屏幕上

[root@localhost sed]# sed 'w output.txt' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
[root@localhost sed]# cat output.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
把 employee.txt 的内容保存到文件 output.txt,但不在屏幕上显示 

[root@localhost sed]#  sed -n 'w output.txt' employee.txt
[root@localhost sed]# cat output.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

只保存第 2 行:

[root@localhost sed]# sed -n '2w output.txt' employee.txt
[root@localhost sed]# cat output.txt
102,Jason Smith,IT Manager

保存第 1 至第 4 行:

[root@localhost sed]#  sed -n '1,4 w output.txt' employee.txt
[root@localhost sed]# cat output.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer

保存第2 行起至最后一行: 


[root@localhost sed]# sed -n '2,$ w output.txt' employee.txt
[root@localhost sed]# cat output.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

保存匹配 Jane 的行: $ sed -n ‘/Jane/ w output.txt’ employee.txt

$ cat output.txt 105,Jane Miller,Sales Manager

保存第一次匹配 Jason 的行至第 4 行:

[root@localhost sed]# sed -n '/Jason/,4 w output.txt' employee.txt
[root@localhost sed]# cat output.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer

如果开始的 4 行里没有匹配到 Jason,那么该命令只保存第 4 行以后匹配到 Jason 行

········其他类似操作都一样。。

sed 替换命令

全局标志 g
用大写 A 替换第一次出现的小写字母 a:

[root@localhost sed]# sed 's/a/A/' employee.txt
101,John Doe,CEO
102,JAson Smith,IT Manager
103,RAj Reddy,Sysadmin
104,AnAnd Ram,Developer
105,JAne Miller,Sales Manager

把所有小写字母 a 替换为大写字母 A:

 [root@localhost sed]# sed 's/a/A/g' employee.txt
101,John Doe,CEO
102,JAson Smith,IT MAnAger
103,RAj Reddy,SysAdmin
104,AnAnd RAm,Developer
105,JAne Miller,SAles MAnAger

数字标志(1,2,3 ….)
把第二次出现的小写字母 a 替换为大写字母 A:

[root@localhost sed]#  sed 's/a/A/2' employee.txt
101,John Doe,CEO
102,Jason Smith,IT MAnager
103,Raj Reddy,SysAdmin
104,Anand RAm,Developer
105,Jane Miller,SAles Manager

打印标志 p(print)
命令 p 代表 print。当替换操作完成后,打印替换后的行。与其他打印命令类似,sed 中比较 有用的方法是和-n 一起使用以抑制默认的打印操作。
只打印替换后的行:

[root@localhost sed]#  sed -n 's/John/Johnny/p' employee.txt
101,Johnny Doe,CEO

写标志 w
只把替换后的内容写到 output.txt 中:

[root@localhost sed]# sed -n 's/John/Johnny/w output.txt' employee.txt
[root@localhost sed]#  cat output.txt
101,Johnny Doe,CEO

忽略大小写标志 i (ignore)
把 john 或 John 替换为 Johnny:

[root@localhost sed]# sed 's/john/Johnny/i' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

使用替换标志组合
使用 g,I,p 和 w 的组合:

[root@localhost sed]#  sed -n 's/manager/Director/igpw output.txt' employee.txt
102,Jason Smith,IT Director
105,Jane Miller,Sales Director
[root@localhost sed]# cat output.txt
102,Jason Smith,IT Director
105,Jane Miller,Sales Director

sed 替换命令分界符
可以用 | ! 等替换

&的作用——获取匹配到的模式
给雇员 ID(即第一列的 3 个数字)加上[ ],如 101 改成[101]

[root@localhost sed]# sed 's/^[0-9][0-9][0-9]/[&]/g' employee.txt
[101],John Doe,CEO
[102],Jason Smith,IT Manager
[103],Raj Reddy,Sysadmin
[104],Anand Ram,Developer
[105],Jane Miller,Sales Manager

分组替换(单个分组)
跟在正则表达式中一样,sed 中也可以使用分组。分组以(开始,以)结束。分组可以用在 回溯引用中。
单个分组:

[root@localhost sed]#  sed 's/\([^,]*\).*/\1/g' employee.txt
101
102
103
104
105

正则表达式:

正则表达式基础
行的开头 ( ^ )
行的结尾 ( $ )
单个字符 ( . )
匹配 0 次或多次 ( * )
匹配一次或多次 ( + )
零次或一次匹配 ( ? )
转义字符 ( \ )
字符集 ( [0-9] )
匹配包含 2、3 或者 4 的行:

[root@localhost sed]# sed -n '/[234]/ p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer

[root@localhost sed]#  sed -n '/[2-4]/ p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer

或操作符 ( | )
打印包含 101 或者包含 102 的行

[root@localhost sed]#  sed -n '/101\|102/ p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager

精确匹配 m 次 ( {m} )
正则表达式后面跟上{m}标明精确匹配该正则 m 次。
匹配 m 至 n 次 ( {m,n} ):
正则表达式后面跟上{m,n}表明精确匹配该正则至少 m,最多 n 次。m 和 n 不能是负数,并 且要小于 255.
正则表达式后面跟上{m,}表明精确匹配该正则至少 m,最多不限。(同样,如果是{,n}表明最 多匹配 n 次,最少一次)。
字符边界 ( \b )

执行sed

使用多命令选项 –e
sed –e ‘command1’ –e ‘command2’ –e ‘command3’
使用\ 折行执行多个命令

sed –n –e ‘/^root/ p’ \
 -e ‘/^nobody/ p’ \ 
 -e ‘/^mail/ p’ \
  /etc/passwd 

使用{ }把多个命令组合

sed –n ‘{ 
/^root/ p 
/^nobody/ p 
/^mail/ p 
}’ /etc/passwd 

sed 脚本文件

sed -f 脚本文件 目标文件
把 sed 当做命令解释器使用
一如你可以把命令放进一个 shell 脚本中,然后调用脚本名称来执行它们一样,你也可以把 sed 用作命令解释器。要实现这个功能,需要在 sed 脚本最开始加入”#!/bin/sed –f”

$ vi myscript.sed #!/bin/sed -f 
#交换第一列和第二列 
s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1, \3/g 
#把整行内容放入<>中 
s/^.*/<&>/ 
#把 Developer 替换为 IT Manager 
s/Developer/IT Manager/ 
#把 Manager 替换为 Director s/Manager/Director/ 
 
现在,给这个脚本加上可执行权限,然后直接在命令行调用它: $ chmod u+x myscript.sed 
 
$ ./myscript.sed employee.txt 

直接修改输入文件
相比这种传统方法,可以在 sed 命令中使用-i 选项,使 sed 可以直接修改输入文件:

sed -i 's/John/Johnny/' employee.txt 

再次提醒: -i 会修改输入文件。或许这正是你想要的,但是务必小心

sed 附加命令

追加命令(命令 a)

在第 2 行后面追加一行

[root@localhost sed]# sed '2a 203,Jack Johnson,Engineer' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
203,Jack Johnson,Engineer
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

在 employee.txt 文件结尾追加一行:

[root@localhost sed]# sed '$ a 106,Jack Johnson,Engineer' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
106,Jack Johnson,Engineer

sed 也可以追加多行。
在匹配 Jason 的行的后面追加两行:

[root@localhost sed]# sed '/Jason/a 203,Jack Johnson,Engineer\n204,Mark Smith,Sales Engineer' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
203,Jack Johnson,Engineer
204,Mark Smith,Sales Engineer
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

插入命令(命令 i)

在第某行之前扎入一段字符
用法和a一样

修改命令(命令 c)
用新数据取代第 2 行:

[root@localhost sed]#  sed '2 c 202,Jack,Johnson,Engineer' employee.txt
101,John Doe,CEO
202,Jack,Johnson,Engineer
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

等同于

  [root@localhost sed]# sed '2s/.*/202,Jack,Johnson,Engineer/' employee.txt
    101,John Doe,CEO
    202,Jack,Johnson,Engineer
    103,Raj Reddy,Sysadmin
    104,Anand Ram,Developer
    105,Jane Miller,Sales Manager

命令 a、i 和 c 组合使用

sed '/Jason/ { 
> a\ > 204,Jack Johnson,Engineer 
> i\ > 202,Mark Smith,Sales Engineer 
> c\ > 203,Joe Mason,Sysadmin 
> }' employee.txt 

打印不可见字符(命令 l)
命令 l 可以打印不可见的字符,比如制表符\t,行尾标志$等。

[root@localhost sed]# sed -n 'l' employee.txt
101,John Doe,CEO  $
102,Jason Smith,IT Manager  $
103,Raj Reddy,Sysadmin  $
104,Anand Ram,Developer  $
105,Jane Miller,Sales Manager $


如果在 l 后面指定了数字,那么会在第 n 个字符处使用一个不可见自动折行,效果如下:

[root@localhost sed]# sed -n 'l 20' employee.txt
101,John Doe,CEO  $
102,Jason Smith,IT \
Manager  $
103,Raj Reddy,Sysad\
min  $
104,Anand Ram,Devel\
oper  $
105,Jane Miller,Sal\
es Manager $

打印行号(命令=)

[root@localhost sed]# sed '=' employee.txt
1
101,John Doe,CEO
2
102,Jason Smith,IT Manager
3
103,Raj Reddy,Sysadmin
4
104,Anand Ram,Developer
5
105,Jane Miller,Sales Manager
[root@localhost sed]#  sed '1,3 =' employee.txt
1
101,John Doe,CEO
2
102,Jason Smith,IT Manager
3
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

转换字符(命令 y)

[root@localhost sed]#  sed 'y/abcde/ABCDE/' employee.txt
101,John DoE,CEO
102,JAson Smith,IT MAnAgEr
103,RAj REDDy,SysADmin
104,AnAnD RAm,DEvElopEr
105,JAnE MillEr,SAlEs MAnAgEr

退出 sed(命令 q)
命令 q 终止正在执行的命令并退出 sed
打印第 1 行后退出:

[root@localhost sed]# sed 'q' employee.txt
101,John Doe,CEO

打印第 5 行后退出,即只打印前 5 行:
[root@localhost sed]# sed ‘5 q’ employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

打印所有行,直到遇到包含关键字 Manager 的行:

[root@localhost sed]# sed '/Manager/ q' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值