6.02.2016

RE (Regular Expression), "sed" command

Regular Expression (RE, 正規表示法)是在Linux環境之下粉重要的一個工具,剛開始會覺得很難學,不易上手;但學會了之後,就會覺得很好用!

但自己偏偏就是屬於前者─不較不用心的那一種人,所以就乾脆把學過的指令和用法記錄下來....

a) 一個'.'就是代表一個字元;若要代表'.',則是在前面多加一個跳脫字元'\',變成'\.'

b) ^Picasso:代表Picasso出現在行首
c) Picasso$:代表Picasso出現在行尾

d)
[A-Z]:一個大寫字母;
[a-z]:一個小寫字母;
[0-9]:一個數字;
[^A-Z]:一個非大寫字母;
[^a-zA-Z]:一個非字母;
[^a-z0-9A-Z]:一個非數字、字母。

e) aA*C:在'a'和'C'之間,字元'A'出現0或0個以上。

f) [a-z]\{3,5\}:以3~5個小寫字母所組成的字串。

會跟RE搭配的指令之一就是"sed"指令。sed指令工具的特色,就是可以在不修改原始檔案的狀況下,執行動態編輯。基本格式:sed "樣式命令" "檔案"

[root@localhost ~] sed "2,25d" /etc/passwd
把第2~25行刪除,其餘顯示。

[root@localhost ~] sed "/root/d" /etc/passwd
搜尋含有"root"的字串,並把它刪除 (Delete)

[root@localhost ~] sed "/[0-9]\{3\}/d" /etc/passwd
把含有3位數的字串刪除。

[root@localhost ~] sed "/^$/d" /etc/passwd
把空白列刪除。

[root@localhost ~] sed '/root/!d' /etc/passwd
搜尋含有"root"的字串,不要刪除。等同於:把不含有"root"的字串刪除。

[root@localhost ~] sed -n "/root/p" /etc/passwd
[root@localhost ~] sed '/root/!d' /etc/passwd
把含有"root"的字串列印 (Print)出來。

[root@localhost ~] sed -n "s/root/picasso/pg" /etc/passwd
在/etc/passwd檔案中,搜尋含有"root"的字串,並全部 (Globle)取代為picasso,且列印出來。

[root@localhost ~] sed -n "s/root//pg" /etc/passwd
在檔案中,搜尋含有"root"的字串,並全部取代為空字串,且列印出來。

[root@localhost ~] sed -n "s/^...//p" /etc/passwd
把檔案中每一行的前3個字元刪除,並列印出來。

[root@localhost ~] sed -n "s/...$//p" /etc/passwd
把檔案中每一行的末3個字元刪除,並列印出來。

[root@localhost ~] set -n "s/\(root\)/\1picasso/pg" /etc/passwd
在檔案中尋找"root"字串,並儲存成檔案\1,再取代成rootpicasso,且列印出來。

[root@localhost ~] sed -n '/root/s/bin/PPG/pg' /etc/passwd
[root@localhost ~] sed -n "/root/s/bin/PPG/pg" /etc/passwd
在檔案中先尋找含有"root"字串的行數;在該行中再尋找含有"bin"的字串,並全部 (Globle)取代為"PPG",且列印 (Print)出來!

[root@localhost ~] sed -n "/root/,/operator/s/bin/fuck/pg" /etc/passwd
在檔案中尋找有"root"字串開使出現的行數,一直到有"operator"字串的行數為止;在這之中再尋找"bin"字串,並全部取代為"fuck",且列印出來!

[root@localhost ~] sed -n "12,24s/bin/dick/pg" /etc/passwd
在檔案中從12行到24行,尋找"bin"字串,並全部取代為"dick"且列印出來!

◎ 補充 (28th Jul, 2020)

前面的用法都是直接把sed指令拿來用;假如我要把某個Shell Script的執行結果,用sed來執行取代或是替換呢?
例如:我要把MAC Address: 00:14:02:03:09:60,把這中間的冒號 (:)給取消掉,那我可以這樣子來呈現:
[root@localhost ~]# 
[root@localhost ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:14:02:03:09:60
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8513 errors:0 dropped:13 overruns:0 frame:0
          TX packets:221 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:2048
          RX bytes:1021746 (997.7 KiB)  TX bytes:32296 (31.5 KiB)

[root@localhost ~]# 
[root@localhost ~]# ifconfig eth0 | grep "HWaddr" | awk '{print $5}' | sed 's/://g'
001402030960
[root@localhost ~]# 

第2個例子,我要把時區 (Time Zone)裡面一些有加上底線 (UnderLine)的城市,因為正常的情況下,沒有人會寫成"New_York",所以我要把底線給取消掉,置換成空白 (Space)字元:
[root@localhost ~]# 
[root@localhost ~]# ls -l /usr/share/zoneinfo/America/ | grep "New_York"
-rw-r--r--    1 root     root          3545 Jul  9 06:29 New_York
[root@localhost ~]# 
[root@localhost ~]# ls -l /usr/share/zoneinfo/America/ | grep "New_York" | awk '{print $9}' | sed 's/_/\ /g'
New York
[root@localhost ~]# 

沒有留言:

張貼留言