3. 打印模式空间(p命令)
利用sed 的p命令,您可以打印当前模式空间的内容。
您可能想为什么需要p命令,这是因为在执行sed命令之后,sed默认会打印模式空间里的内容。
您将会看到有几个原因:p命令能让您针对性的控制哪些内容将被打印到标准输出(stdout)。 通常,当使用p命令的时候会结合-n选项,防止sed默认打印的内容也出现在标准输出。 否则,如果只用p(打印)命令的话,匹配行就会显示两次。
下面的例子中,exployee.txt的每一行都显示两次:
$ 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
每行打印一次(类似于’cat exployee.txt’):
$ 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
指定一个范围
如果您在sed命令没有指定匹配范围,默认它匹配所有的行。 下面的几个例子演示了在执行sed时都指定了范围。
仅打印第2行:
$ sed -n '2 p' employee.txt
102,Jason Smith,IT Manager
打印从第1行到第4行:
$ sed -n '1,4 p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
打印从2行到最后一行($代表最后一行):
$ sed -n '2,$ p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
修改地址范围
您也可以使用”,”,”+”和 ~ 修改地址范围表示方法。
在上面的例子中,我们已经看到了几个使用逗号(,)表示范围的例子。它的意思很明显:n,m显示从n行到m行。
加号(+)可以和逗号一起使用,指定一个数字,而不是具体到哪行。 例如,n,+m表示从第n行及后面的m行。
波浪号(~)也可以用在地址范围里。 其意思是是每次跳几行。 例如,地址范围n~m表示,sed应在第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等。
只打印奇数行:
$ sed -n '1~2 p' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
105,Jane Miller,Sales Manager
模式匹配
正如您可以指定数字表示地址(或范围),也可以指定一个匹配模式(或模式范围),下面是几个例子。
打印含有”Jane”的行:
$ sed -n '/Jane/ p' employee.txt
105,Jane Miller,Sales Manager
打印从第一次匹配”Jason”的行到第4行:
$ sed -n '/Jason/,4 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
注:如果在第4行之前没有找到匹配“Jason”的行,这命令将打印第四行后面含有”Jason”的行。
打印从第一次匹配”Raj”的行到最后一行:
$ sed -n '/Raj/,$ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
打印从匹配“Raj”的行开始到匹配“Jane”的行:
$ sed -n '/Raj/,/Jane/ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
打印从匹配“Jason”的行及它后面的两行:
$ sed -n '/Jason/,+2 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer