Linux文字處理三劍客之sed命令

2021-10-03 14:30:06 字數 4113 閱讀 6302

sed是一種流編輯器,它是文字處理中非常中的工具,能夠完美的配合正規表示式使用,功能不同凡響。處理時,把當前處理的行儲存在臨時緩衝區中,稱為「模式空間」(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有 改變,除非你使用重定向儲存輸出。sed主要用來自動編輯乙個或多個檔案;簡化對檔案的反覆操作;編寫轉換程式等。

sed命令格式

sed [options] 'command' file(s)

sed [options] -f scriptfile file(s)

替換文字中的字串:

sed 's/book/books/' file
-n選項和p命令一起使用表示只列印那些發生替換的行:

sed -n 's/test/test/p' file

sed -i 's/book/books/g' file
使用字尾 /g 標記會替換每一行中的所有匹配:

sed 's/book/books/g' file
當需要從第n處匹配開始替換時,可以使用 /ng:

echo sksksksksksk | sed 's/sk/sk/2g'

sksksksksksk

echo sksksksksksk | sed 's/sk/sk/3g'

sksksksksksk

echo sksksksksksk | sed 's/sk/sk/4g'

sksksksksksk

以上命令中字元 / 在sed中作為定界符使用,也可以使用任意的定界符:

sed 's:test:text:g'

sed 's|test|text|g'

定界符出現在樣式內部時,需要進行轉義:

sed 's/\/bin/\/usr\/local\/bin/g'
刪除空白行:

sed '/^$/d' file
刪除檔案的第2行:

sed '2d' file
刪除檔案的第2行到末尾所有行:

sed '2,$d' file
刪除檔案最後一行:

sed '$d' file
刪除檔案中所有開頭是test的行:

sed '/^test/'d file
正規表示式 \w\+ 匹配每乙個單詞,使用 [&] 替換它,& 對應於之前所匹配到的單詞:

echo this is a test line | sed 's/\w\+/[&]/g'

[this] [is] [a] [test] [line]

所有以192.168.0.1開頭的行都會被替換成它自已加localhost:

sed 's/^192.168.0.1/&localhost/' file

192.168.0.1localhost

匹配給定樣式的其中一部分:

echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'

this is 7 in a number

命令中 digit 7,被替換成了 7。樣式匹配到的子串是 7,.... 用於匹配子串,對於匹配到的第乙個子串就標記為 \1,依此類推匹配到的第二個結果就是 \2,例如:

echo aaa bbb | sed 's/\([a-z]\+\) \([a-z]\+\)/\2 \1/'

bbb aaa

love被標記為1,所有loveable會被替換成lovers,並列印出來:

sed -n 's/\(love\)able/\1rs/p' file
sed '表示式' | sed '表示式'

等價於:

sed '表示式; 表示式'

sed表示式可以使用單引號來引用,但是如果表示式內部包含變數字串,就需要使用雙引號。

test=hello

echo hello world | sed "s/$test/hello"

hello world

所有在模板test和check所確定的範圍內的行都被列印:

sed -n '/test/,/check/p' file
列印從第5行開始到第乙個包含以test開始的行之間的所有行:

sed -n '5,/^test/p' file
對於模板test和west之間的行,每行的末尾用字串aaa bbb替換:

sed '/test/,/west/s/$/aaa bbb/' file
-e選項允許在同一行裡執行多條命令:

sed -e '1,5d' -e 's/test/check/' file
上面sed表示式的第一條命令刪除1至5行,第二條命令用check替換test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第乙個替換命令將影響第二個替換命令的結果。

和 -e 等價的命令是 --expression:

sed --expression='s/test/check/' --expression='/love/d' file
file裡的內容被讀進來,顯示在與test匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面:

sed '/test/r file' filename
在example中所有包含test的行都被寫入file裡:

sed -n '/test/w file' example
將 this is a test line 追加到 以test 開頭的行後面:

sed '/^test/a\this is a test line' file
在 test.conf 檔案第2行之後插入 this is a test line:

sed -i '2a\this is a test line' test.conf
將 this is a test line 追加到以test開頭的行前面:

sed '/^test/i\this is a test line' file
在test.conf檔案第5行之前插入this is a test line:

sed -i '5i\this is a test line' test.conf
sed '/test/' file
把1~10行內所有abcde轉變為大寫,注意,正規表示式元字元不能使用這個命令:

sed '1,10y/abcde/abcde/' file
列印完第10行後,退出sed

sed '10q' file
在sed處理檔案的時候,每一行都被儲存在乙個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將 列印在螢幕上。接著模式空間被清空,並存入新的一行等待處理。

sed -e '/test/h' -e '$g' file
在這個例子裡,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入乙個稱為保持快取區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,g命令取出保持緩衝區的行,然後把它放回模式空間中,且追加到現在已經存在於模式空間中的行的末尾。在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複製並追加到該檔案的末尾。

互換模式空間和保持緩衝區的內容。也就是把包含test與check的行互換:

sed -e '/test/h' -e '/check/x' file
sed指令碼是乙個sed的命令清單,啟動sed時以-f選項引導指令碼檔名。sed對於指令碼中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文字,如果在一行中有多個命令,要用分號分隔。以#開頭的行為注釋行,且不能跨行。

sed [options] -f scriptfile file(s)
方法1:

sed -n 'p;n' test.txt  #奇數行

sed -n 'n;p' test.txt #偶數行

方法2:

sed -n '1~2p' test.txt  #奇數行

sed -n '2~2p' test.txt #偶數行

grep -a 1 scc urfile

sed -n '/scc/' urfile

awk '/scc/' urfile

Linux文字處理三劍客

grep 作用 文字搜尋工具,根據使用者指定的 模式對目標檔案逐步進行匹配檢查,列印匹配到的行 grep root etc passwd grep命令選項 grep user etc passwd v 顯示不被pattern 匹配的行 e 僅顯示匹配到的字串 grep user etc passwd...

linux文字處理三劍客

常用引數 v 顯示不能夠被匹配到的行 i 忽略大小寫字元 o 僅顯示匹配到的字串 q 靜默模式,不輸出任何資訊 a 後 行 b 前 行 c 前後各 行 e 使用ere,相當於egrep常用引數 n 只列印模式匹配的行 e 直接在命令列模式上進行sed動作編輯,此為預設選項 f 將sed的動作寫在乙個...

文字處理三劍客

文字處理三劍客 劍客一 grep 作用 行 過濾 用法 grep 正規表示式 檔案 路徑 grep e 擴充套件類正規表示式 檔案 路徑 劍客二 sed 用法 sed 選項 位址定位sed命令 檔案 路徑 sed 選項 正規表示式 sed命令 檔案 路徑 sed 選項 位址定位 正規表示式 sed命...