Sed命令

腳本命令若是不常常使用,那麼很容易忘記,因此這裏記錄下,常常使用到的一些腳本命令。忘記的時候,看下筆記也可以快速撿起來正則表達式

1.Sed命令語法

sed [options] {sed-commands} {input-file}spa

sed 首先從 input-file 中讀取第一行,而後執行全部的 sed-commands; 再讀取第二行,執行全部 sed-commands,重複這個過程,直到 input-file結束。3d

經過制定[options] 還能夠給 sed 傳遞一些可選的選項。blog

 

(1)執行單個命令

例如:ip

打印/etc/passwd文件下的全部記錄字符串

sed -n 'p' /etc/passwd

 

(2)執行腳本文件

{sed-commands}  能夠是多個命令, 也能夠將多個命令放在一個文件中,而後經過-f來調用。input

例如:string

sed -n -f sed-script /etc/passwd

sed-script代碼以下:it

/^root/ p
/^nobody/ p

 

(3)執行多個命令  

也可使用-e來執行多個命令io

例如:

sed -n -e '/^root/ p' -e '/^nobody/ p' /etc/passwd

 

2. sed執行流程 

 

 

3. Sed命令

3.1 p命令

使用命令p, 能夠打印模式空間的內容。

sed在執行完命令時,默認會打印模式空間的內容。因此通常使用p命令時,通常要使用-n選項,來屏蔽sed的默認輸出,不然同一行會打印兩次。

p命令用來控制輸出你感興趣的行。

例如:

sed -n '/Jane/ p' employee.txt // 打印匹配Jane的行
sed -n '1,2 p' employee.txt // 打印1~2行
sed -n '2,$ p' employee.txt // 打印2到最後一行
sed -n '2 p' employee.txt // 只打印第2行
sed -n '/Jason/, $ p' employee.txt // 打印匹配到Jason的行到最後一行
sed -n '/Jason/, /Jane/ p' employee.txt // 打印匹配Jason到Jane的行

  

m,n表示從m到n行
m~n表示從m行開始,每次跳過n行
1~2打印 1,3,5行
m,+n表示從m行開始後的n行 

3.2 d命令 

命令d用來刪除模式空間的內容,注意:它只會刪除模式空間的內容,不會刪除原文件的內容

命令d和上面的p命令差很少

sed -n '/Jane/ d' employee.txt 
sed -n '1,2 d' employee.txt
sed -n '2,$ d' employee.txt 
sed -n '2 d' employee.txt 
sed -n '/Jason/, $ d' employee.txt 
sed -n '/Jason/, /Jane/ d' employee.txt 

  刪除空白行:

sed -n '/^$/ d' employee.txt

  刪除全部註釋行:

sed '/^#/ d' employee.txt

3.3 w命令

w命令能夠將模式空間的內容寫到文件中

sed -n '2 w  output.txt' employee.txt
sed -n '1,4 w  output.txt' employee.txt
sed -n '2,$ w  output.txt' employee.txt
sed -n '/Jane/ w output.txt' employee.txt
sed -n '/Jason/, 4 w output.txt' employee.txt
sed -n '/Jason/, $ w output.txt' employee.txt

 3.4 s命令

sed命令使用最多功能最強大的命令就是s命令。

s命令的命令格式爲:

sed ‘[address-range|pattern-range] s/original-string/replacement-string/[substitute-flags]’
input file

 例如:

# 將Manager替換爲Director
sed 's/Manager/Director/' employee.txt

# 將匹配Sales的行中的Manger替換爲Director
sed '/Sales/s/Manager/Director/' employee.txt

  sed默認狀況下只會替換第一次出現的original-string, 若是要替換匹配行中出現的全部original-string, 則須要使用g.

例如:

# 只替換每行第一次出現的a爲A
sed 's/a/A/' employee.txt

# 替換每行全部的a爲A
sed 's/a/A/g' employee.txt

  還能夠指定替換第幾回出現的original-string. 例如:

# 只替換每行第二次出現的a爲A
sed 's/a/A/2' employee.txt

3.5 s+p命令

替換後打印替換了的那些行:

sed -n 's/John/Johnny/p' employee.txt
sed -n 's/a/A/2p' employee.txt

3.6 s+w命令

sed -n 's/John/Johnny/w output.txt' employee.txt
sed -n 's/John/Johnny/2w output.txt' emmployee.txt

3.7 &的做用

&很是有用,它用來獲取匹配到的模式。

當在 replacement-string 中使用&時,它會被替換成匹配到的 original-string 或正則表達式,這是個頗有用的東西。

例如:

$ sed 's/^[0-9][0-9][0-9]/[&]/' 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 's/.*/"&"/' employee.txt

3.8 分組替換

跟在正則表達式中同樣,sed 中也可使用分組。分組以\(開始,以\)結束。分組能夠用在回溯引用中。

$ sed 's/\([^,]*\).*/\1/g' employee.txt
101
102
103
104
105

正則表達式\([^,]*\)匹配字符串從開頭到第一個逗號之間的全部字符(並將其放入第一個分組中)

注意:()要轉義

  

你也可使用多個\(和\)劃分多個分組,使用多個分組時,須要在 replacement-string 中使用\n來指定第 n 個分組。

例如:

sed 's/\([^,]*\),\([^,]*\),\([^,]*\)/\1,\3/g' employee.txt
101,CEO
102,IT Manager
103,Sysadmin
104,Developer
105,Sales Manager

 

3.9 直接修改原文件

上面說到sed默認不會修改原文件,若是要直接修改輸入文件,可使用命令i .

例如:

sed -i 's/John/Jonny/' employee.txt

-i 會直接修改輸入文件。一個保護性的措施是在-i後面加上bak, 這樣sed就會在修改原始文件以前,備份一份。

例如:

sed -ibak 's/John/Jonny/' employee.txt

  

4. Sed附加命令

4.1 a命令(追加命令)

使用命令a能夠在指定的行後面插入新行.

例如:

在第2行後面插入一行:

$sed '2 a 203,Jack Johnson,Engineer' employee.txt
101,Jonny Doe,CEO
102,Jason Smith,IT Manager
203,Jack Johnson,Engineer
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

在最後一行插入一行: 

$sed '$ a 106,Jack Johnson,Engineer' employee.txt
101,Jonny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
106,Jack Johnson,Engineer

追加多行之間能夠用\n 來換行

4.2 i命令(插入命令)

插入命令i和追加命令相似,只不過插入命令是在指定行的前面插入。

例如:

在第2行的前面插入一行:

 $sed '2 i 203,Jack Johnson,Engineer' employee.txt

 

在匹配Jason的行前面插入2行:

sed '/Jason/i 203,Jack Johnson,Engineer\n204,Mark Smith,Sales Engineer' employee.txt

4.3 c命令(修改命令)

修改命令c能夠用新行替代舊行。

語法:

sed ‘[address] c the-line-to-insert’ input-file

例如,用新行替換第2行:

sed '2 c 202,Jack,Johnson,Engineer' employee.txt

sed 也能夠用多行來取代一行:

$sed '/Raj/ c 203,Jack Johnson,Engineer\n204,Mark Smith,Sales Engineer' employee.txt
101,Jonny Doe,CEO
102,Jason Smith,IT Manager
203,Jack Johnson,Engineer
204,Mark Smith,Sales Engineer
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

4.4 打印行號=

命令=會在每一行後面輸出行號

$sed '=' employee.txt
1
101,Jonny Doe,CEO
2
102,Jason Smith,IT Manager
3
103,Raj Reddy,Sysadmin
4
104,Anand Ram,Developer
5
105,Jane Miller,Sales Manager

打印文件的總行數:

$ sed -n '$ =' employee.txt 5

  

打印包含Jane的行的行號

$sed '/Jane/ =' employee.txt
101,Jonny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
5
105,Jane Miller,Sales Manager

  

若是你只想顯示行號而不顯示內容,能夠結合-n選項來使用=命令,例如:

sed -n '/Raj/ =' employee.txt
3

 

sed平時比較經常使用的命令就這些。

相關文章
相關標籤/搜索