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