引用
sed [options] {sed-commands} {input-file}
sed 每次从input-file 读取一行,然后对这一行执行{sed-commands}。执行完后,继续读文件中的下一行,然后对第二行执行sed-commands命令,直到把文件完全读完,结束。
1、打印/etc/passwd 文件中的所有行:
引用
sed -n 'p' /etc/passwd
对于sed命令可以对每一行执行多个sed命令,也可以将sed命令放到sed脚本文件中。
1)将sed命令放到脚本文件中,
引用
sed [options] -f {sed-commands-in-a-file} {input-file}
eg:
引用
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:~$
/^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:~$
2)也可以将多个sed命令使用-e 参数链接起来:
eg:
引用
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
root:x:0:0:root:/root:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
如果需要对每一行执行多个sed命令的时候,可以使用反斜杠将-e所指定的命令断行:
引用
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:~$
> -e '/^nobody/ p' \
> /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ledkk@ubuntu:~$
也可以通过使用大括号将多个命令括起来,也可以实现断行的效果:
引用
sed [options] '{
sed-command-1
sed-command-2
}' input-file
sed-command-1
sed-command-2
}' input-file
eg:
引用
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:~$
> /^root/ p
> /^nobody/ p
> }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ledkk@ubuntu:~$
sed命令并不修改原文件,他只是简单的将输出打印到标准输出上。如果想保存sed命令所做的处理,可以使用文件重定向来处理:
引用
sed [options] sed-command input-file > filename.txt
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:
引用
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
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
一般来说,在sed-command命令之前不加地址范围的话,sed-command将会作用到input-file中的每一行上,如果在sed-command命令之前加上地址范围后,可以限制sed-command只作用于指定的行上:
eg:
1) 只打印第二行
引用
ledkk@ubuntu:~$ sed -n '2 p' employee.txt
102,Jason Smith,IT Manager
102,Jason Smith,IT Manager
2) 打印input-file中的1到4行:
引用
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
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
3)打印inputfile中的1到最后一行:($ 代表input-file中的最后一行)
引用
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
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
我们可以使用【,+ ~】来设置命令的地址范围:
【,】号一般表示一个范围: 【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:
只打印奇数行:
引用
ledkk@ubuntu:~$ sed -n '1~2 p' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager
ledkk@ubuntu:~$
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager
ledkk@ubuntu:~$
和使用地址范围来限制sed-command作用的行外,还可以使用正则表达式来限制sed-command作用的行:
eg:
引用
ledkk@ubuntu:~$ sed -n '/Jane/ p' employee.txt
105,Jane Miller,Sales Manager
ledkk@ubuntu:~$
105,Jane Miller,Sales Manager
ledkk@ubuntu:~$
打印从第一个匹配Jane的行开始的4行文本:(如果没有匹配时,将会什么也不打印)
引用
ledkk@ubuntu:~$ sed -n '/Jason/ ,4 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer