Chapter 1: Sed Syntax and Basic Commands
sed
examples
使用的sed
案例均为下面文件
1. Sed Command Syntax
sed
基本语法
|
|
sed
读取文本为按行读取匹配
输出
/etc/passwd
文件的所有行
1234567891011 sed -n 'p' /etc/passwd[root@localhost ~]# sed -n 'p' /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/halt
sed
命令文件的基本语法
|
|
sed命令文件格式为一行一个sed命令,实现多个sed命令
sed
使用-e
参数实现多个sed命令
|
|
|
|
为了方便阅读,可以使用\
换行
也可以使用{}
包括命令组
例如:
2.Sed Scripting Flow
Sed命令运行步骤
- Read 逐行读取
- Execute 逐行执行命令 one by one
- Print 可以是空匹配
- Repeat 重复步骤
3. Print Pattern Space (p command)
Using the sed p command, you can print the current pattern space.
使用p命令,你可以输出当前的模式
The following example prints every line of employee.txt twice:
单独使用p命令会使每行都输出两次
Print each line once (functionally the same as ‘cat employee.txt’):
配合n命令可以只输出一次
- -n 取消默认的输出123456$ sed -n 'p' employee.txt101,John Doe,CEO102,Jason Smith,IT Manager103,Raj Reddy,Sysadmin104,Anand Ram,Developer105,Jane Miller,Sales Manager
Specifying an Address Range 指定地址范围
如果你不指定范围,sed默认匹配全部行
Print only the 2nd line:
|
|
Print from line 1 through line 4:
|
|
Print from line 2 through the last line ($ represents the last line):
输出第二行一直到最后一行$
匹配最后一行
Modify Address Range
三种模式:逗号模式,加号模式,和波浪号模式
- 逗号模式
- 表示绝对的地址范围
- 加号模式
- 表示相对的地址范围
- 波浪号模式
- 表示等差序列的步长1234• 1~2 matches 1,3,5,7, etc.• 2~2 matches 2,4,6,8, etc.• 1~3 matches 1,4,7,10, etc.• 2~3 matches 2,5,8,11, etc.
- 表示等差序列的步长
Print only odd numbered lines:输出奇数行
|
|
Pattern Matching 模板匹配
Print lines matching the pattern “Jane”:
|
|
Print lines starting from the 1st match of “Jason” until the 4th line:
输出从第一个Jason
行开始到第四行的所有行(并且输出所有的匹配到Jason
的行)
Note: If there were no matches for “Jason” in the 1st 4 lines, this
command would print the lines that match “Jason” after the 4th line.如果在前四行没有匹配到
Jason
,则在第四行之后只输出匹配到Jason
的行
Print lines starting from the 1st match of “Raj” until the last line:
|
|
Print lines starting from the 1st line matching “Raj” until the 1st line matching “Jane”:
|
|
如果
Raj
匹配行后没有找到Jane
匹配行,则输出到最后行。(不管前面是否有Jane
行,都不会输出Jane
行)
该模式会循环匹配(Jane
之后还有Raj
到Jane
也会输出,只有Raj
会输出后面所有行)
12345678910111213 st=>start: startop=>operation: read a lineop1=>operation: printop2=>operation: skipop3=>operation: read a lineop4=>operation: printcond=>condition: Raj yes or no?cond1=>condition: Jane yes or no?ed=>endst->op->cond(yes)->op1->op3->cond1(no)->op1cond(no)->op2->opcond1(yes)->op4->op
Print the line matching “Jason” and 2 lines immediately after that:
|
|
4. Delete Lines (d command)
使用d参数,可以删除行。
NOTE:d参数仅仅只删除输出流,就像其他的sed参数,并不会修改原始文件。
如果不使用其他参数,单独使用d参数,则匹配所有行,所以不会有任何输出。相当于p参数的非,不显示匹配到的行。如果前面使用
-n
参数,则不会有任何输出
因为d参数没有输出功能,-n
参数是取消默认输入的输出
1 sed 'd' employee.txt
Useful Delete Examples (常用实例)
删除空行:
|
|
删除所有注释行:
|
|
NOTE:当使用多个命令参数匹配同一行时,d命令执行之后会删除匹配行,不会在删除行进一步执行后续命令
12345 [root@localhost SedAwk]# sed -n -e '2 d' -e '2 p' employee.txt[root@localhost SedAwk]# sed -n -e '2 p' -e '2 d' employee.txt102,Jason Smith,IT Manager[root@localhost SedAwk]#
5. Write Pattern Space to File (w command)
将标准输出输入到指定文件
Write the content of employee.txt file to file output.txt (and display on screen):
|
|
Write the content of employee.txt file to output.txt file but not to screen:
加-n
参数,将不会输出标准输入
使用w参数会覆盖原本文件里面的内容
12345678 $ sed -n 'w output.txt' employee.txt$ cat output.txt101,John Doe,CEO102,Jason Smith,IT Manager103,Raj Reddy,Sysadmin104,Anand Ram,Developer105,Jane Miller,Sales Manager
Write only the 2nd line:
|
|
Note: You might not use the w command frequently. Most people use
UNIX output redirection, instead, to store the output of sed to a file.
For example:sed 'p' employee.txt > output.txt
你可能不会使用w命令,因为大部分在UNIX
系统中,使用>符号代替