Linux sed基本使用


1、sed編輯器被稱作流編輯器(stream aditor),跟普特的交互式文本編輯器恰好相反。在交互式文本編輯器中(比如vim),你可以用鍵盤命令來交互地插入、刪除或替換數據中的文本。流編輯器則會在編輯器處理數據之前基於預先提供的一組規則來編輯數據流。

sed編輯器可以基於輸入到命令行的或是存儲在命令文本中的命令來處理數據流中的數據。它每次從輸入中讀取一行,用提供的編輯命令匹配數據、按命令中指定的方式修改流中的數據,然后生成的數據輸出到STDOUT。在流編輯器將所有命令與一行數據進行匹配后,它會讀取下一行數據並重復這個過程。在流編輯器處理完流中的所有數據行后,它就會停止。
使用sed命令格式如下:
sed options script file
選項有:
-e script     在處理輸入時,將script中指定的命令添加到運行的命令中
-f file       在處理輸入時,將file中指定的命令添加到運行的命令中
-n            不要為每個命令生成輸出,等待print命令輸出
1)在命令行定義編輯命令
$ echo "This is a test" | sed 's/test/big test/'
This is a big test
 
$ cat data1
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
 
$ sed 's/dog/cat/' data1
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
2)在命令行使用多個編輯器命令(要使用-e選項)
$ sed -e 's/brown/green/; s/dog/cat/' data1
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
3)從文件中讀取編輯器命令(使用-f選項)
$ cat script1.sed
s/brown/green/
s/fox/elephant/
s/dog/cat/
 
$ sed -f script1.sed data1
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
 
2、sed編輯器基礎
1)替換標記
關於substitute命令如何替換字符串中匹配的模式需要注意一點,就是在默認情況下它只替換每行中出現的第一處。要讓替換命令對一行中不同地方出現的文本都起作用,必須使用替換標記(substitution flag)
s/pattern/repacement/flags
1> 數字,表明新文本將替換第幾處模式匹配的地方;
2> g,表明新文本將會替換所有已有文本出現的地方;
3> p,表明原來行的內容要打印出來;
4> w file,將替換原來行的結果寫到文件中。
 
$ echo "This is a test" | sed -n 's/test/big test/p'
This is a big test
注意:-n選項將禁止sed編輯器輸出,但p替換標記會輸出修改過的行,將二者配合全盤則會只輸出被substitute命令修改過的行。
 
2)替換字符
$ sed 's/\bin\/bash/\/bin\/csh/' /etc/passwd
sed編輯器可以用感嘆號用作分隔符,使得路徑名更容易被讀取和理解
$ sed 's!/bin/bash!/bin/cash!' /etc/passwd
 
3)使用地址
默認情況下,在sed編輯器中使用的命令會作用於文本數據的所有行。如果只想作用於特定的某行或某些行,你必須用行尋址(line addressing)。
在sed編輯器中有兩種形式的行尋址:
1》行的數字范圍;
2》用文本模式來過濾出某行。
兩種形式都使用相同的格式來指定地址:
[address]command
也可以為特定的地址將多個命令放在一起:
address{
     command1
     command2
     command3
}
1> 數字方式的行尋址
$ sed '2s/dog/cat/' data1 
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
 
$ sed '2,3s/dog/cat/' data1 
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
 
$ sed '2,$s/dog/cat/' data1 
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
2> 使用文本模式過濾器
格式如下:
/pattern/command
$ echo "This is a test" | sed '/test/s/test/TEST/'
This is a TEST
3> 組合命令
如果需要在單行上執行多條命令,可以用花括號將多條命令組合在一起。
$ sed '2{
> s/fox/elelhant/
> s/dog/cat/
> }' data1
The quick brown fox jumps over the lazy dog.
The quick brown elelhant jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
4)刪除行
$ cat data2
line1
line2
line3
line4
 
$ sed '3d' data2
line1
line2
line4
你可以刪除用兩個文本模式來刪除某個范圍內的行,但這么做時要小心。你指定的第一個模式會“打開”行刪除功能,第二個模式會“關閉”行刪除功能。sed編輯器會刪除兩個指定行之間的所有行(包括指定的行)
$ sed '/1/,/3/d' data2
line4
如果“打開”了刪除功能,而沒有“關閉”,則會刪除之后所有的數據。
$ sed '/1/,/5/d' data2
5)插入和附加文本
1》插入(insert)命令i會在指定行前增加一個新行;
2》追加(append)命令a會在指定行后增加一個新行。
不能在單個命令行上使用這兩條命令。你必須指定是要將行插入還是附加到另一行。格式如下:
sed '[address]command\
new line'
new line中文本將會出現在sed編輯器輸出中你指定的位置。記住,當使用插入命令時,文本會出現在數據流文本的前面,而當使用附加命令時,文本會出現在數據流文本的后面:
$ echo "Test line 2" | sed 'i\Test line 1'
Test line 1
Test line 2
 
$ echo "Test line 2" | sed 'a\Test line 1'
Test line 2
Test line 1
6)修改行
修改(change)命令允許修改數據流中整行文本的內容。它跟插入和附加命令的工作機制一樣,你必須在sed命令中單獨指定新行。
$ sed '3c\This is a changed line' ./data2
line1
line2
This is a changed line
line4
也可以在修改命令中使用地址區間,但結果可能不是你想要的(因為它是包括區間所在的行):
$ sed '2,3c\This is a changed line' ./data2
line1
This is a changed line
line4
7)轉換命令
轉換(transform, y)命令是唯一可以處理單個字符的sed編輯命令。轉換命令格式如下:
[address]y/inchars/outchars/
轉換命令會進行inchars和outchars值一對一映射。
$ sed 'y/1234/6789/' data2
line6
line7
line8
line9
轉換命令是全局的,也就是說,它會自動替換文本行中找到的指定字符的所有實例,
$ echo "this 1 is a test of 1 try." | sed 'y/123/456/'
this 4 is a test of try.
8)回顧打印
這里有3條也能用來打印數據流中的信息的命令:
1> 小寫p命令用來打印文本行;
2> 等號(=)命令用來打印等號;
3> 小寫l命令用來列出行。
$ echo "This is a test" | sed 'p'
This is a test
This is a test
 
$ sed '=' data1
1
The quick brown fox jumps over the lazy dog.
2
The quick brown fox jumps over the lazy dog.
3
The quick brown fox jumps over the lazy dog.
4
The quick brown fox jumps over the lazy dog.
 
9)用sed和文件一起工作
1》向文件寫入
[address]w filename
$ sed '1,3w test' data2
line1
line2
line3
line4
$ cat test
line1
line2
line3
2》向文件讀取數據
讀取命令(r)允許你將一個獨立文件中的數據插入到數據流中。
[address]r filename
$ cat data3
This    line    contains    tabs.
$ sed '3r data3' data2
line1
line2
line3
This    line    contains    tabs.
line4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM