3. 打印模式空间(p 命令)


使用 sed 的p命令,你可以打印当前的模式空间。

您可能想知道为什么需要p命令,因为默认情况下 sed 在执行其命令后打印模式缓冲区。

如你所见,有一些原因。该命令允许你控制打印到标准输出的内容,p是标准 sed 流程的默认行为,你可以通过-n选项来禁止默认打印。 否则的话,当你显示指定p(打印)作为你的一个参数,该行将被打印两次。

以下示例将employee.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 employee.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命令之前指定地址范围的一些示例。

$ sed -n '2 p' employee.txt
102,Jason Smith,IT Manager
$ sed -n '1,4 p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
$ 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 

正如您可以指定编号地址(或地址范围)一样,您也可以指定要匹配的模式(或模式范围),如接下来的几个示例所示。

$ sed -n '/Jane/ p' employee.txt
105,Jane Miller,Sales Manager 
$ sed -n '/Jason/,4 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer 
注意:如果前 4 行中没有匹配到 "Jason",则此命令将在第 4 行之后只打印与 "Jason" 匹配的行。
$ sed -n '/Raj/,$ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
$ sed -n '/Raj/,/Jane/ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager 
$ sed -n '/Jason/,+2 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer