OPS Notes By 枯木

1-3、Print Pattern Space[译]

| Comments

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

你也许会好奇为什么需要p命令,默认的sed会在执行完命令后输出模式空间的缓存。

其实这是有原因的,等会你将看到,这个命令将允许你专门控制打印到标准输出。通常来说,你应该使用-n选项来抑制作为标准sed流一部分的默认输出。否则,当执行p命令的时候,该行会输出两次。

接下来的例子employee.txt文件中的行将输出两次:

1
2
3
4
5
6
$ sed 'p' employee.txt
101,John Doe,CEO
101,John Doe,CEO
102,Jason Smith,IT Manager
102,Jason Smith,IT Manager
… …

打印每行一次(作用和’cat expolyee.txt’相同):

1
2
3
$ sed -n 'p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager

特定的地址范围

如果你在使用sed命令前不指定地址范围,那么默认会匹配所有的行,接下来的一些例子是在使用sed命令前指定一个范围

只打印第二行

1
2
$ sed -n '2 p' employee.txt
102,Jason Smith,IT Manager

打印1到2行

1
2
3
$ sed -n '1,2 p' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager

打印第2行到结尾($表示到最后一行)

1
$ sed -n '2,$ p' employee.txt

修改地址范围

你可以通过逗号、+和~修改地址范围。

  • ,在上面的例子中,我们看到了使用逗号(,)修改地址范围规范的一部分。它的意义很明了: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,等。

只打印奇数行:

1
2
3
4
$ sed -n '1~2 p' employee.txt
101,John Doe,CEO
103,Raj Reddy,Sysadmin
… …

词匹配

正如你可以指定一定数量地址(或者地址范围),你也可以指定一个特定的词(或者词的范围)匹配,在接下来的例子中将会演示。

打印匹配有“Jane”的行:

1
2
$ sed -n ‘/Jane/ p’ employee.txt
105,Jane Miller,Sales Manager

打印从第一行到第四行匹配“Jason”的行:

1
2
3
4
$ sed -n '/Jason/,4 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
注:如果这里再1到4行没有匹配到”Jason”,那么这条命令会打印出包含“Jason”之后的行。

打印从第一行到最后一行匹配”Raj”的行:

1
2
3
4
$ sed -n '/Raj/,$ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

打印匹配行”Raj”直到匹配到”Jane”行:

1
2
3
4
$ sed -n '/Raj/,/Jane/ p' employee.txt
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
注:如果没有匹配到Jane,则打印“Raj“行到最后一行

打印匹配“Jason”的行并且打印“Jason”行后的两行:

1
2
3
4
$ sed -n '/Jason/,+2 p' employee.txt
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer

–EOF–

Comments