sed... 持续更新

sed 命令的基本形式为:
[quote]sed [options] {sed-commands} {input-file}[/quote]
sed 每次从input-file 读取一行,然后对这一行执行{sed-commands}。执行完后,继续读文件中的下一行,然后对第二行执行sed-commands命令,直到把文件完全读完,结束。

1、打印/etc/passwd 文件中的所有行:
[quote]sed -n 'p' /etc/passwd [/quote]

对于sed命令可以对每一行执行多个sed命令,也可以将sed命令放到sed脚本文件中。
1)将sed命令放到脚本文件中,
[quote]sed [options] -f {sed-commands-in-a-file} {input-file}[/quote]

eg:
[quote]ledkk@ubuntu:~$ cat test-script.sed
/^root/ p
/^nobody/ p
ledkk@ubuntu:~$
ledkk@ubuntu:~$ sed -n -f test-script.sed /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ledkk@ubuntu:~$ [/quote]
2)也可以将多个sed命令使用-e 参数链接起来:
eg:
[quote]ledkk@ubuntu:~$ sed -n -e '/^root/ p' -e '/^nobody/ p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh[/quote]

如果需要对每一行执行多个sed命令的时候,可以使用反斜杠将-e所指定的命令断行:
[quote]ledkk@ubuntu:~$ sed -n -e '/^root/ p' \
> -e '/^nobody/ p' \
> /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ledkk@ubuntu:~$ [/quote]
也可以通过使用大括号将多个命令括起来,也可以实现断行的效果:
[quote]sed [options] '{
sed-command-1
sed-command-2
}' input-file[/quote]

eg:
[quote]ledkk@ubuntu:~$ sed -n '{
> /^root/ p
> /^nobody/ p
> }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ledkk@ubuntu:~$ [/quote]

sed命令并不修改原文件,他只是简单的将输出打印到标准输出上。如果想保存sed命令所做的处理,可以使用文件重定向来处理:[quote] sed [options] sed-command input-file > filename.txt[/quote]

2、sed脚本执行的顺序:
1)sed命令会从inputfile 中读取一行文本到 【临时空间】 中去,【临时空间】是一个用来存放从输入文件中读取的行的临时空间。
2)sed将会对【临时空间】中的这一行文本执行sed-command,如果有多个sed-command,将会对【临时空间】中的文本一个接着一个的执行。
3)打印被sed-command处理过的文本行,然后清空【临时空间】中的文本行。
4)重新从input-file中取出下一行,接着步骤1执行,知道到了文件的结束。

3、(p 命令)使用sed 命令 【p】 可以用来打印【临时空间】中的文本行。
sed默认在执行完sed-command命令后,会自动打印【临时空间】中的文本,然而通过【p】命令,可以控制打印的内容。一般来说当是用【p】命令时,需要使用-n 参数挂起sed默认的打印操作,否则将会重复打印【临时空间】中的内容,如下所示:
eg:
[quote]ledkk@ubuntu:~$ 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[/quote]
一般来说,在sed-command命令之前不加地址范围的话,sed-command将会作用到input-file中的每一行上,如果在sed-command命令之前加上地址范围后,可以限制sed-command只作用于指定的行上:
eg:
1) 只打印第二行
[quote]ledkk@ubuntu:~$ sed -n '2 p' employee.txt
102,Jason Smith,IT Manager[/quote]
2) 打印input-file中的1到4行:
[quote]ledkk@ubuntu:~$ sed -n '1,4 p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer[/quote]
3)打印inputfile中的1到最后一行:($ 代表input-file中的最后一行)
[quote]ledkk@ubuntu:~$ sed -n '1,$ 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[/quote]
我们可以使用【,+ ~】来设置命令的地址范围:
【,】号一般表示一个范围: 【1,2】表示第1、2行
【+ 】号一般和,一起使用:【1,+2】表示从第1行开始,到1+2行结束。
【~】号用来表示略过的行数:
1~2 表示1,3,5,7,9.......
2~2 表示2,4,6,8,10.......
1~3 表示1,4,7,10.....

eg:
只打印奇数行:
[quote]ledkk@ubuntu:~$ sed -n '1~2 p' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager
ledkk@ubuntu:~$ [/quote]
和使用地址范围来限制sed-command作用的行外,还可以使用正则表达式来限制sed-command作用的行:
eg:
[quote]ledkk@ubuntu:~$ sed -n '/Jane/ p' employee.txt
105,Jane Miller,Sales Manager
ledkk@ubuntu:~$ [/quote]

打印从第一个匹配Jane的行开始的4行文本:(如果没有匹配时,将会什么也不打印)
[quote]ledkk@ubuntu:~$ sed -n '/Jason/ ,4 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer[/quote]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值