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
命令之前指定地址范围的一些示例。
Example1:只打印第 2 行
$ sed -n '2 p' employee.txt 102,Jason Smith,IT Manager
Example2:打印 第 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
Example3:打印从第 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 行等。
Example1:仅打印奇数行
$ sed -n '1~2 p' employee.txt 101,John Doe,CEO 103,Raj Reddy,Sysadmin 105,Jane Miller,Sales Manager
模式匹配
正如您可以指定编号地址(或地址范围)一样,您也可以指定要匹配的模式(或模式范围),如接下来的几个示例所示。
Example1:打印与模式 "Jane"
匹配的行
$ sed -n '/Jane/ p' employee.txt 105,Jane Miller,Sales Manager
Example2:打印从第一次匹配到 "Jason"
开始一直到第 4 行结束
$ sed -n '/Jason/,4 p' employee.txt 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer
"Jason"
,则此命令将在第 4 行之后只打印与 "Jason"
匹配的行。
Example3:打印从第一次匹配到 "Raj"
开始直到最后一行
$ sed -n '/Raj/,$ p' employee.txt 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
Example4:打印从匹配 "Raj"
的行开始直到匹配 "Jane"
的行结束
$ sed -n '/Raj/,/Jane/ p' employee.txt 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
Example5:打印与 "Jason"
匹配的行以及紧随其后的 2 行
$ sed -n '/Jason/,+2 p' employee.txt 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer