Linux -- sed命令(1)

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

sed編輯器可以根據命令來處理數據流中的數據,這些命令要麼從命令行中輸入,要麼存儲在一個命令文本文件中。sed編輯器會執行下列操作:

(1) 一次從輸入中讀取一行數據。
(2) 根據所提供的編輯器命令匹配數據。
(3) 按照命令修改流中的數據。
(4) 將新的數據輸出到 STDOUT 。
二、單行數據處理命令
在流編輯器將所有命令與一行數據匹配完畢後,它會讀取下一行數據並重復這個過程。在流編輯器處理完流中的所有數據行後,它就會終止。由於命令是按順序逐行給出的,sed編輯器只需對數據流進行一遍處理就可以完成編輯操作。這使得sed編輯器要比交互式編輯器快得多,你可以快速完成對數據的自動修改。

sed 命令的格式如下:

sed options script file
-e script
在處理輸入時,將 script 中指定的命令添加到已有的命令中
-f file
在處理輸入時,將 file 中指定的命令添加到已有的命令中
-n
不產生命令輸出,使用 print 命令來完成輸出
1 s替換命令
1.1 s命令(substitute)
從echo命令接受數據流
$ echo “I am good” | sed ‘s/good/best/’
從文件中接受數據流
$ cat test1.txt
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/’ test1.txt
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.
在命令行中使用多個編輯器命令
要在 sed 命令行上執行多個命令時,只要用 -e 選項就可以了。

$ sed -e ‘s/brown/green/; s/dog/cat/’ test1.txt
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.
兩個命令都作用到文件中的每行數據上。命令之間必須用分號隔開,並且在命令末尾和分號之間不能有空格。

如果不想用分號,也可以用bash shell中的次提示符>來分隔命令。只要輸入第一個單引號標示出sed程序腳本的起始(sed編輯器命令列表),bash會繼續提示你輸入更多命令,直到輸入了標示結束的單引號。

$ sed -e ’

s/brown/green/
s/fox/elephant/
s/dog/cat/’ data1.txt
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.
從文件中讀取編輯器命令
如果有大量要處理的 sed 命令,那麼將它們放進一個單獨的文件中通常會更方便一些。可以在 sed 命令中用 -f 選項來指定文件。

$ cat script1.sed
s/brown/green/
s/fox/elephant/
s/dog/cat/
$ sed -f script1.sed data1.txt
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.
在這種情況下,不用在每條命令後面放一個分號。sed編輯器知道每行都是一條單獨的命令。
跟在命令行輸入命令一樣,sed編輯器會從指定文件中讀取命令,並將它們應用到數據文件中的
每一行上。

$ sed -f script1.sed data1.txt
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.
$
在這種情況下,不用在每條命令後面放一個分號。sed編輯器知道每行都是一條單獨的命令。
跟在命令行輸入命令一樣,sed編輯器會從指定文件中讀取命令,並將它們應用到數據文件中的
每一行上。

1.2 替換標記
替換命令在替換多行中的文本時能正常工作,但默認情況下它只替換每行中出現的第一處。要讓替換命令能夠替換一行中不同地方出現的文本必須使用替換標記(substitution flag)。替換標記會在替換命令字符串之後設置。

有4種可用的替換標記:

數字,表明新文本將替換第幾處模式匹配的地方

把每行的第三個cat替換爲dog

$ cat test2.txt
cat cat cat cat cat
cat cat cat cat cat
cat cat cat cat cat
$ sed ‘s/cat/dog/3’ test2.txt
cat cat dog cat cat
cat cat dog cat cat
cat cat dog cat cat
g ,表明新文本將會替換所有匹配的文本

把所有的cat都替換爲dog

$ cat test2.txt
cat cat cat cat cat
cat cat cat cat cat
cat cat cat cat cat
$ sed ‘s/cat/dog/3’ test2.txt
dog dog dog dog dog
dog dog dog dog dog
dog dog dog dog dog
p ,表明把匹配的內容要打印出來;
在第一類替換中,可以指定sed編輯器用新文本替換第幾處模式匹配的地方,通常會和 sed 的 -n 選項一起使用。
$ cat test3.txt
Line1: I am a cat
Line2: I am a dog
$ sed -n ‘s/dog/pig/p’ test3.txt
Line2: I am a pig
w file ,將替換的結果寫到文件中。會產生同樣的輸出,但輸出同時被保存文件裏
$ sed ‘s/dog/cat/w test1.o.txt’ test1.txt
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.
$ cat test1.o.txt
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.
通過輸出重定向也可以達到這個目的,但不會在終端顯示。

$ sed ‘s/dog/cat/’ test1.txt > test1.o2.txt
$ cat test1.o1.txt
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.
只有那些包含匹配模式的行纔會保存在指定的輸出文件中。

1.3 替換字符
有時你會在文本字符串中遇到一些不太方便在替換模式中使用的字符。Linux中一個常見的例子就是正斜線(/)。替換文件中的路徑名會比較麻煩。比如,如果想用C shell替換/etc/passwd文件中的bash shell,必須這麼做:

sed ‘s//bin/bash//bin/csh/’ /etc/passwd
由於正斜線通常用作字符串分隔符,因而如果它出現在了模式文本中的話,必須用反斜線來轉義。這通常會帶來一些困惑和錯誤。

要解決這個問題,sed編輯器允許選擇其他字符來作爲替換命令中的字符串分隔符:

$ sed ‘s!/bin/bash!/bin/csh!’ /etc/passwd
在這個例子中,感嘆號被用作字符串分隔符,這樣路徑名就更容易閱讀和理解了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章