利用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