Linux —— 查找與替換
文本查找:
grep, egrep, fgrep
grep:根據基本正則表達式定義的模式搜索文檔,並將符合模式的文本行顯示出來
注意:搜索時屬於部分搜索,只要某一行有某一部分符合模式,就會被顯示出來
模式:pattern,文本字符和正則表達式的元字符組合而成的匹配條件
grep 選項 模式 文件
選項:
-i:忽略大小寫
linlin@ubuntu:~/linlin/test$ cat exp.txt I have a pen I like to eat apple The HHHHH the Hhhhh linlin@ubuntu:~/linlin/test$ grep -i hhh exp.txt The HHHHH the Hhhhh
--color:高亮顯示
-v:顯示沒有被模式匹配的行
linlin@ubuntu:~/linlin/test$ grep -v hhh exp.txt I have a pen I like to eat apple The HHHHH
-o:只顯示被模式匹配到的字符串
linlin@ubuntu:~/linlin/test$ grep -o hhh exp.txt hhh
-E:擴展正則表達式,等於 egrep
-F:使用固定字符串進行匹配,等於 fgrep
egrep:等於 grep -E
fgrep:不支持正則表達式,但搜索速度更快
文本替換
sed:流編輯器(Stream Editor),以批處理的方式而不是交互的方式來編輯文件
它是文本處理中非常中的工具,能夠完美的配合正則表達式使用。處理時,把當前處理的行存儲
在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed命令處理緩沖區中的內容,處
理完成后,把緩沖區的內容送往屏幕。接着處理下一行,這樣不斷重復,直到文件末尾。文件內
容並沒有改變。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
模式空間:在內存中
語法格式:sed [選項] '地址(對哪些行進行處理)命令' FILE(s)
常用選項:
-n:靜默模式,不再默認顯示模式空間內的內容 -i:直接修改原文件 -e 腳本 -e 腳本……:使用多個腳本 -f /文件/to/腳本/:指定一個文件,文件每一行都是腳本(地址,命令) -r:使用擴展正則表達式
表示:
1.地址:起始行,結束行
例如,1,100
2.命令:使用正則表達式指定的模式
3.模式1,模式2 表示第一次被模式1匹配到的行開始到第一次被模式2匹配到的行結束,這中間的所有行
4.行數,處理指定的行
$表示最后一行,$-n表示倒數第n+1行
5.起始行,+n
表示從起始行與其開始向后的n行,共n+1行
命令:
a\ 在當前行下面插入文本。 i\ 在當前行上面插入文本。 c\ 把選定的行改為新的文本。 d 刪除,刪除選擇的行。 D 刪除模板塊的第一行。 s 替換指定字符 h 拷貝模板塊的內容到內存中的緩沖區。 H 追加模板塊的內容到內存中的緩沖區。 g 獲得內存緩沖區的內容,並替代當前模板塊中的文本。 G 獲得內存緩沖區的內容,並追加到當前模板塊文本的后面。 l 列表不能打印字符的清單。 n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。 N 追加下一個輸入行到模板塊后面並在二者間嵌入一個新行,改變當前行號碼。 p 打印模板塊的行。 P(大寫) 打印模板塊的第一行。 q 退出Sed。 b lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。 r file 從file中讀行。 t label if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。 T label 錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。 w file 寫並追加模板塊到file末尾。 W file 寫並追加模板塊的第一行到file末尾。 ! 表示后面的命令對所有沒有被選定的行發生作用。 = 打印當前行號碼。 # 把注釋擴展到下一個換行符以前。
s/模式/字符串/修飾符:查找並替換,將每一行中能被模式匹配到的字符串轉換成指定字符串,默認只替換每一行中第一
次被模式匹配到的字符串
修飾符
g:全局替換 i:忽略字符大小寫 s后面的分隔符不一定需要為\,也可以為其他內容,但每個分隔符需要一樣,這樣可以保證對文本內容中含有分隔符字符 s\\\,s### \(\),\1,\2……后向引用 &:引用模式匹配到的整個串,即表示模式匹配到的內容 -n選項 與 p命令一起使用,表示只顯示匹配到的行
root@ubuntu:/home/linlin/linlin/shell# sed -n 's/root/ROOT/pg' /etc/passwd ROOT:x:0:0:ROOT:/ROOT:/bin/bash