首頁 > 軟體

正規表示式與grep和sed

2020-06-16 17:06:05

目錄

1.正規表示式
2.grep
3.sed

grep和sed需要正規表示式,我們需要注意的正規表示式與萬用字元用法的區分。

1.正規表示式

REGEXP,正規表示式:由一類特殊字元以及文字字元所編寫的模式,其中有些字元(元字元)不表示字元字母意義,而表示控制或通配的功能,可通過man regex來檢視更詳細的資訊。
正規表示式有兩類,一個是基本正規表示式BRE,另一個是擴充套件的正規表示式ERE。
正規表示式的引擎:採用不同演算法,檢查處理正規表示式的軟體模組PCRE(Perl Compatible Regular Expressions)
元字元的分類:字元匹配、匹配次數、位置錨定、分組。

1.字元匹配

.:匹配任意單個字元
[ ]:匹配指定範圍內的任意單個字元([.]就是.)
[ ^ ]:匹配指定範圍外的任意單個字元
[:alnum:]:字母和數位
[:alpha:]:代表任何英文大小寫字元,亦即 A-Z, a-z
[:lower:]:小寫字母 [:upper:] 大寫字母
[:blank:]:空白字元(空格和製表符)
[:space:]:水平和垂直的空白字元(比[:blank:]包含的範圍廣)
[:cntrl:]:不可列印的控制字元(退格、刪除、警鈴...) )
[:digit:]:十進位制數位 [:xdigit:] 十六進位制數位
[:graph:]:可列印的非空白字元
[:print:]:可列印字元
[:punct:]:標點符號

2.匹配次數

匹配次數是用在要指定次數的字元後面,用於指定前面的字元要出現的次數。

*:匹配前面的字元任意次,包括0次,貪婪模式:盡可能長的匹配
.*:任意長度的任意字元
?:匹配其前面的字元0 或1次
+:匹配其前面的字元至少1次
{n}:匹配前面的字元n次 次
{m,n}:匹配前面的字元至少m 次,至多n次 次
{,n}:匹配前面的字元至多n次
{n,}:匹配前面的字元至少n次

3.位置錨定

位置錨定是用於定位出現的位置。

^:行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側
^PATTERN$:用於模式匹配整行
^$:空行
^[[:space:]]*$:空白行
< 或 b:詞首錨定,用於單詞模式的左側
> 或 b:詞尾錨定;用於單詞模式的右側
<PATTERN>:匹配整個單詞

4.分組

分組:()將一個或多個字元捆綁在一起,當作一個整體進行處理,如:(root)+。分組括號中的模式匹配到的內容會被正規表示式引擎記錄於內部的變數中,這些變數的命名方式為:1, 2, 3, ...1表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字元。
範例(string1+(string2)*);1 :string1+(string2)*;2 :string2
後向參照:參照前面的分組括號中的模式所匹配字元 , 而非模式本身。
|:或者
範例a|b:a 或b;C|cat: C 或cat ;(C|c)at:Cat 或cat

5.擴充套件的正規表示式

擴充套件的正規表示式,顧名思義,就是在正規表示式上的擴充套件,是在元字元匹配方面的寫法簡化。
大部分的元字元和正規表示式相同,這裡把不同的記錄一下:
字元匹配:

[ ]:指定範圍內的字元。

次數匹配:

?:0 或1次
+:1 次或多次
{m}:匹配m次
{m,n}:至少m ,至多n次

分組:
() 將一個或多個字元捆綁在一起,當作一個整體進行處理。
|:或者
範例:a|b:a 或b;C|cat:C 或cat;(C|c)at:Cat 或cat

上述就是我所知道的正規表示式內容了,可能有所遺漏,大家可以通過man幫助補足,下面我們看進入正題,也就是運用上了。

2.grep

grep:Global search REgrular expression and Print out the line
grep 的作用:文字搜尋工具,根據使用者指定的“模式”對目標文字逐行進行匹配檢查,並列印匹配到的行。
grep的模式:由正規表示式字元及其文字字元所編寫的過濾條件。
grep的用法:

grep [OPTION]... PATTERN [FILE]...
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用的[option]:
--color=auto:對匹配到的文字著色顯示
-v:顯示不被pattern 匹配到的行,反向選擇
-i:忽略字元大小寫
-n:顯示匹配的行號
-c:統計匹配的行數
-o:僅顯示匹配到的字串
-q:靜默模式,不輸出任何資訊
-A #:after,後#行 ,顯示包含這行後續#行
-B #:before,前#行
-C #:context,前後各#行
-e:實現多個選項間的成邏輯or關係,grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整個單詞,(字母,數位,下劃線不算單詞邊界)
-E:使用ERE
-F:相當於fgrep ,不支援正規表示式
-l <範本樣式>:列出檔案內容符合指定的範本樣式的檔名稱。
-h <範本樣式>:在顯示符合範本樣式的那一列之前,不標示該列所屬的檔名稱。
-H <範本樣式>:在顯示符合範本樣式的那一列之前,標示該列的檔名稱。
-e <範本樣式>:指定字串作為查詢檔案內容的範本樣式。

上述選項中有個-E選項,這個就是可以支援使用擴充套件的正規表示式,當然這個選項有另個寫法:grep -E == egrep
還有個-F選項,這個用法是相當於fgrep的,即grep -F==fgrep不支援正規表示式的使用,也就是使用它時,你可以使用萬用字元。
舉個範例:

grep的用法多種多樣,大家可以多加嘗試!

3.sed

sed:Stream EDitor,又名行編輯器。
sed:是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時快取區中,稱為“模式空間”(patternspace),接著用sed命令處理快取區中的內容,處理完成後,把快取區的內容送往螢幕。然後讀入下一行,執行下一個迴圈。如果沒有使用諸如‘D’的特殊命令,那麼會在兩個迴圈之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重定向儲存輸出。
sed的功能:主要用來自動編輯一個或多個檔案,簡化對檔案的反復操作,編寫轉換程式等,且支援正規表示式!
使用方法:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
常用[option]:
-n:不輸出模式空間內容到螢幕,即不自動列印
-e:多點編輯,-e sm2 -e sm1
-f /PATH/SCRIPT_FILE:從指定的指令碼檔案中,讀取出指令碼內容,並合併到sed COMMAND中進行執行。通俗的理解為將指令碼寫在了檔案中。
-r:支援使用擴充套件正規表示式
-i:直接修改原始檔。如果在命令中加入了 -i 選項,原始檔的內容將會被直接修改掉。
-i[SUFFIX]:這還是-i 選項,這個選項的意思是說,如果在使用該選項的過程中指定了字尾名稱,那麼該命令在執行的過程中會先將原始檔備份成以[SUFFIX] 為字尾的檔案,然後對檔案進行操作

從使用方法中看到了{script-only-if-no-other-script},這個代表了在模式空間和保留空間的處理過程,也就是怎麼處理的,這裡稱為了script。那麼這個script是什麼呢?怎麼書寫呢?下面就來說下有關地址定界、編輯命令、高階編輯命令,這些就是組成scrip的元素。

地址定界:就是說明用來處理一行中的那個些部分的。

不給地址:對全文進行處理
#:指定的行/pattern/能夠被模式匹配到的每一行
#,#:從第n行到第m行
#,+#:從第n行,加上其後面m行
/pat1/,/pat2/:符合第一個模式和第二個模式的所有行
#,/pat1/:從第n行到符合 /pat1/ 這個模式的行
1~2 :~ 這個符號表示步進,1~2 表示的是奇數行
2~2:表示的是偶數行

編輯命令:地址定界後,對範圍內的內容進行相關編輯。

d:刪除模式空間匹配的行,並立即啟用下一輪迴圈
p:列印當前模式空間內容,追加到預設輸出之後
q:讀取到指定行之後退出
a []text:在指定行後面追加文字支援使用n 實現多行行後追加
i []text:在行前面插入文字
c []text:替換行為單行或多行文字
w /path/somefile:儲存模式匹配的行至指定檔案
r /path/somefile:讀取指定檔案的文字至模式空間中匹配到的行後
=:為模式空間中的行列印行號
!:模式空間中匹配行取反處理
s///:查詢替換, 支援使用其它分隔符,s@@@ ,s###
:對一行進行多次操作的命令的分割
&:配合s///使用,代表前面所查詢到的字元等,&sm ;sm&。
g:行內全域性替換。也可以指定行內的第幾個符合要求的進行替換:2g,就表示第2個替換。
p:顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行儲存至檔案中

高階編輯命令:也是對定界範圍內的內容進行處理了,不過是處理起來更加高階。

P:列印模式空間開端至n 內容,並追加到預設輸出之前
h:把模式空間中的內容覆蓋至保持空間中;m > b
H:把模式空間中的內容追加至保持空間中; m>>b
g:從保持空間取出資料覆蓋至模式空間; b>m
G:從保持空間取出內容追加至模式空間; b>>m
x:把模式空間中的內容與保持空間中的內容進行互換; m <->b
n:讀取匹配到的行的下一行覆蓋至模式空間; n>m
N:讀取匹配到的行的下一行追加至模式空間; n>>m
d:刪除模式空間中的行; delete m
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文字,並不會讀取新的 輸入行,而使用合成的模式空間重新啟動迴圈。如果模式空間不包含換行符,則會像發出d 命令那樣啟動正常的新迴圈

看著有點有,這裡寫幾個用法範例:

sed ‘2p’ /etc/passwd
sed –n ‘2p’ /etc/passwd
sed –n ‘1,4p’ /etc/passwd
sed –n ‘/root/p’ /etc/passwd
sed –n ‘2,/root/p’ /etc/passwd
sed -n ‘/^$/=’ file
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
sed ‘/root/asuperman’ /etc/passwd
sed ‘/root/isuperman’ /etc/passwd
sed ‘/root/csuperman’ /etc/passwd
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed 's/test/mytest/g' example
sed –n ‘s/root/&superman/p’ /etc/passwd
sed –n ‘s/root/superman&/p’ /etc/passwd
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets
sed -n 'n;p' FILE
sed '1!G;h;$!d' FILE
sed 'N;D‘ FILE
sed '$!N;$!D' FILE
sed '$!d' FILE
sed ‘G’ FILE
sed ‘g’ FILE
sed ‘/^$/d;G’ FILE
sed 'n;d' FILE
sed -n '1!G;h;$p' FILE

上面這些範例大家可以都嘗試下,多嘗試就知道什麼意思了!
上述所有內容就是我所知道的有關grep和sed以及配合正規表示式的用法了,它們功能很強大,能處理絕大部分的文字、檔案問題。若上述有那些不對的地方,歡迎指出,謝謝!

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-10/147269.htm


IT145.com E-mail:sddin#qq.com