亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

Linux中文本處理命令sed的使用

添加時間:2016-2-16 19:25:06  添加: 思海網絡 
sed對文本的處理很強大,并且sed非常小,參數少,容易掌握,他的操作方式根awk有點像。sed按順序逐行讀取文件。然后,它執行為該行指定的所有操作,并在完成請求的修改之后的內容顯示出來,也可以存放到文件中。完成了一行上的所有操作之后,它讀取文件的下一行,然后重復該過程直到它完成該文件。在這里要注意一點,源文件(默認地)保持不被修改。sed 默認讀取整個文件并對其中的每一行進行修改。說白了就是一行一行的操作。我用sed主要就是用里面的替換功能,真的很強大。下面以實例,詳細的說一下,先從替換開始,最常用的。

參數

sed -h
 -n, --quiet, --silent    取消自動打印模式空間
 -e 腳本, --expression=腳本   添加“腳本”到程序的運行列表
 -f 腳本文件, --file=腳本文件  添加“腳本文件”到程序的運行列表
 --follow-symlinks    直接修改文件時跟隨軟鏈接
 -i[擴展名], --in-place[=擴展名]    直接修改文件(如果指定擴展名就備份文件)
 -l N, --line-length=N   指定“l”命令的換行期望長度
 --posix  關閉所有 GNU 擴展
 -r, --regexp-extended  在腳本中使用擴展正則表達式
 -s, --separate  將輸入文件視為各個獨立的文件而不是一個長的連續輸入
 -u, --unbuffered  從輸入文件讀取最少的數據,更頻繁的刷新輸出
 --help     打印幫助并退出
 --version  輸出版本信息并退出

例1
測試文件



代碼如下:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

例a,這個例子,把test文件中的root替換成tankzhang,只不過只替換一次及終止在這一行的操作,轉到下一行


代碼如下:
[zhangy@BlackGhost mytest]# sed 's/root/tankzhang/' test |grep tank
tankzhang:x:0:0:root:/root:/bin/bash

例b,這個例子,用tankzhang把文件test中的root全部替換掉,請注意g這個字母,global的縮寫


代碼如下:
[zhangy@BlackGhost mytest]# sed 's/root/tankzhang/g' test |grep zhang
tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash

例c,加了-n p后表示只打印那些發生替換的行(部分替換),上面的例子,我并沒有加上grep


代碼如下:
[zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/p' test
tankzhang:x:0:0:root:/root:/bin/bash

例d,加了-n pg后表示只打印那些發生替換的行(全部替換),上面的例子,我并沒有加上grep


代碼如下:
[zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/pg' test
tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash

例e,在第二行,到第八行之間,替換以zhang開頭的行,用ying來替換,并顯示替換的行


代碼如下:
[zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/^zhang/ying/gp'
yingy:x:1000:100:,,,:/home/zhangy:/bin/bash

例f,當有多個命令要執行時,可以用分號來分開,并且分隔符可以自定義,默認是/。上面的例子意思是在第二行,到第八行之間,替換以zhang開頭的行,用ying來替換,在5,到10間,用goodbay來替換dbus,并顯示替換的行


代碼如下:
[zhangy@BlackGhost mytest]# cat test | sed -n '2,8s/^zhang/ying/gp;5,10s#dbus#goodbay#gp'
yingy:x:1000:100:,,,:/home/zhangy:/bin/bash
goodbay:x:81:81:System message bus:/:/bin/false

例g,這個例子根上面的那個例子一樣,只不過有一點不同,那就是-e來充當了分號的作用,-e也能分割多個命令。


代碼如下:
[zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/zhang/ying/gp' -ne '5,10s#dbus#goodbay#gp'
yingy:x:1000:100:,,,:/home/yingy:/bin/bash
goodbay:x:81:81:System message bus:/:/bin/false

例h,正則的用法,在sed里面用括號的話要加上\的,不然會報錯的。


代碼如下:
[zhangy@BlackGhost mytest]# sed -ne '2,8s/^\(zhangy\)/\1ing/gp' test
zhangying:x:1000:100:,,,:/home/zhangy:/bin/bash
[root@masters ~]# sed -ne '2,8s/^\(zhangy\)/&ing/gp' test
zhangying:x:1000:100:,,,:/home/zhangy:/bin/bash

例i,&的用處是,在找到的字符串后加上&后面的字符串,zhang后都加上了ying


代碼如下:
[zhangy@BlackGhost mytest]# sed -ne '2,15s/zhang/&ying/gp' test
zhangyingy:x:1000:100:,,,:/home/zhangyingy:/bin/bash
ba:x:1002:1002::/home/zhangyingy:/bin/bash
@zhangyingying:*:1004:1004::/home/test:/bin/bash

例j,這個例子是說,在以zhang開頭的行開始,到匹配Po的行結束,在他們之間進行替換


代碼如下:
[zhangy@BlackGhost mytest]# sed -ne '/^zhang/,/Po/s/zhang/ying/gp' test
yingy:x:1000:100:,,,:/home/yingy:/bin/bash
ba:x:1002:1002::/home/yingy:/bin/bash
@yingying:*:1004:1004::/home/test:/bin/bash

例k,n;這里的n是next的縮寫,找到root的行后,將其下一行的中的bin換成tank


代碼如下:
[zhangy@BlackGhost mytest]$ sed '/root/{n;s/bin/tank/}' test
root:x:0:0:root:/root:/bin/bash
tank:x:1:1:bin:/bin:/bin/false

例m,y的作用是將匹配的字符換成大寫,不過替換字符和被替換字符長度要一樣


代碼如下:
[zhangy@BlackGhost mytest]$ sed -e '1,2y/root/ROOT/' test
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
bin:x:1:1:bin:/bin:/bin/false

例n,h的作用是將找到的行,放到一個緩存區,G的作用是將緩存區中的內容放到最后一行


代碼如下:
[zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '$G' test
................................
.............................
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
root:x:0:0:root:/root:/bin/bash

例o,行替換,用匹配root的行,來替換匹配zhangy的行


代碼如下:
[zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '/zhangy/g' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
root:x:0:0:root:/root:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
root:x:0:0:root:/root:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
root:x:0:0:root:/root:/bin/bash

例p,這個例子是說,在以zhang開頭的行開始,到匹配Po的行結束,在他們之間進行替換


代碼如下:
[zhangy@BlackGhost mytest]# sed -ne '/^zhang/,/Po/s/zhang/ying/gp' test
yingy:x:1000:100:,,,:/home/yingy:/bin/bash
ba:x:1002:1002::/home/yingy:/bin/bash
@yingying:*:1004:1004::/home/test:/bin/bash

例q,3q的意思是到第三行的時候,退出


代碼如下:
[zhangy@BlackGhost mytest]$ sed -e 's/bin/tank/g;3q' test
root:x:0:0:root:/root:/tank/bash
tank:x:1:1:tank:/tank:/tank/false
daemon:x:2:2:daemon:/stank:/tank/false

例r,特殊匹配

匹配數字別忘了中括號外面還有一個中括號。
[:alnum:] 字母數字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表鍵
[:cntrl:] 任何控制字符
[:digit:] 數字 [0-9]
[:graph:] 任何可視字符(無空格)
[:lower:] 小寫 [a-z]
[:print:] 非控制字符
[:punct:] 標點字符
[:space:] 空格
[:upper:] 大寫 [A-Z]
[:xdigit:] 十六進制數字 [0-9 a-f A-F]



代碼如下:
[zhangy@BlackGhost mytest]# sed -ne '2,15s/zhangy.*[[:digit:]]/=======/gp' test
=======:,,,:/home/zhangy:/bin/bash
@=======::/home/test:/bin/bash


例2
例a,刪除1,14行



代碼如下:
[zhangy@BlackGhost test]$ sed -e '1,14d' test
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

例b,刪除4以后的行,包括第4行,把$當成最大行數就行了。


代碼如下:
[zhangy@BlackGhost mytest]$ sed -e '4,$d' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false

例c,刪除包括false的行,或者包括bash的行,別忘了加\


代碼如下:
[zhangy@BlackGhost mytest]$ sed -e '/\(false\|bash\)$/d' test
policykit:x:102:1005:Po

例d,刪除從匹配root的行,到匹配以test開頭的行,中間的行


代碼如下:
[zhangy@BlackGhost mytest]$ sed -e '/root/,/^test/d' test
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

例3
例a,讀取test2的內容,并將其寫入到匹配行的下面



代碼如下:
[zhangy@BlackGhost mytest]$ sed -e '/^root/r test2' test
root:x:0:0:root:/root:/bin/bash
=============
-------------
+++++++++++++
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false

例b,將匹配數字的行,寫入test2中


代碼如下:
[zhangy@BlackGhost mytest]$ sed '/[[:digit:]]/w test2' test

例c,將要插入的東西,插入匹配行的下面


代碼如下:
[zhangy@BlackGhost mytest]$ sed '/root/a\\ ===aaaa====' test
root:x:0:0:root:/root:/bin/bash
===aaaa====
bin:x:1:1:bin:/bin:/bin/false

例d,正好根a相反,將要插入的東西,插入到匹配行的上面


代碼如下:
[zhangy@BlackGhost mytest]$ sed '/^daemon/i\\=================' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
=================
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false

例4
#取得一個文件(或目錄)路徑的父目錄,s@@@為替換格式,\(/.*/\)是指一個"/"后面跟了任意字符又跟了一個"/",其中\(\)是用來把匹配內容作為一個整體后向引用,[^/]\{1,\}是指一個非"/"字符出現了一次,兩次,或多次;/\?是指"/"出現了0次或1次,\1是后向引用前面匹配的內容



代碼如下:
[root@practice ~]# echo "/usr/local/bin/" |sed 's@\(/.*/\)[^/]\{1,\}/\?@\1@'
/usr/local/
#使用擴展正則表達式后,亦可如此:
[root@practice ~]# echo "/etc/rc.d/rc.sysinit" | sed -r 's@(/.*/)[^/]+/?@\1@'
/etc/rc.d/

關鍵字:Linux、命令、sed
分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站