sed:編輯器 流編輯器,文本流編輯
ed: Stream EDitor, 行編輯器; 介紹:sed是 一個非交換性文本流編輯器,它編輯文件或標準輸入導出的文本拷貝。標準輸入可能來自鍵盤、文件重定向、字符串或變量,或者管道的文本。 sed可以干什么? 別忘了vi也是一個文本編輯器。sed可以隨意編輯小或大的文件,有許多sed命令用來編輯、刪除,并允許做這項工作時不在現場。sed一次性處理所有改變,因而變得效率高,節省時間。
sed工作原理
pattem space:模式空間 讀取文件一行至模式空間 sed命令是面向行處理的,每次處理一行內容。處理時,sed會把要處理的行存儲在緩沖區中,接著用sed命令處理緩沖區的內容,處理完成后,把緩沖區內容送至屏幕。接著處理下一行,不斷重復,直到末尾,這個緩沖區被稱為"模式空間"。
用法:
sed [選項] sed 命令 輸入文件 script: '地址命令' 在命令行使用sed命令時,實際上命令要加單引號,sed也允許加雙引號。
常用選項:
-n:不輸出模式中的內容至屏幕; -e: 多點編輯; -f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本; -r: 支持使用擴展正則表達式; -i: 原處編輯; 地址定界: (1) 不給地址:對全文進行處理; (2) 單地址: #: 指定的行; /pattern/:被此處模式所能夠匹配到的每一行; (3) 地址范圍: #,# #,+# /pat1/,/pat2/ #,/pat1/ (4) ~:步進 1~2:所有奇數 2~2:所有偶數 編輯命令: d: 刪除 p: 顯示模式空間中的內容 地址定界 一塊使用,被地址界定的,通常與-n a \text:在行后面追加文本;支持使用\n實現多行追加; i \text:在行前面插入文本;支持使用\n實現多行插入; c \text:替換行為單行或多行文本; w /path/to/somefile: 保存模式空間匹配到的行至指定文件中; r /path/from/somefile:讀取指定文件的文本流至模式空間中匹配到的行的行后; =: 為模式空間中的行打印行號; !: 取反條件; s///:支持使用其它分隔符,s@@@,s###; 替換標記: g: 行內全局替換; p: 顯示替換成功的行; w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中; sed 's@r..t@&er@' /etc/passwd 后向引用
練習:
使用-p顯示行 print 命令格式為[address,[address]p,一般跟-n選項 顯示/etc/passwd第二行 sed -n '2p' /etc/passwd 顯示/etc/passwd前三行 sed -n '1,3p' /etc/passwd 顯示以root開頭的行 sed -n '/^root/p' /etc/passwd 顯示已root開頭和nologin結尾的行 sed -n '/^root/,/nologin$/p' /etc/passwd 打印最后一行 sed -n '$p' /etc/passwd 打印首行 sed -n '1p' /etc/passwd 打印全部 sed -n '1,$p' /etc/passwd 使用模式和行號進行查找 格式--->line_number,/pattern/ 在11行查找root sed -n '11,/root/'p /etc/passwd 顯示所有奇數行 sed -n '1~2p' a 顯示所有偶數行 sed -n '2~2p' a d: 刪除 刪除/etc/passwd第一行 sed -n'1d' /etc/passwd 刪除第一到第三行 sed -n '1,3d' /etc/passwd 刪除最后一行 sed '$d' /etc/passwd 刪除uucp這個字符串的一行 sed -n '/uucp/d' passwd a \text 在root行前面追加hello word sed -i '/root/ a \hello word' passwd i \text 在root行后面追加hello word sed -i '/root/ i \hello word' passwd c \text 替換root所在的行為hello word sed -i '/root/ c \hello word' passwd s///---->替換 替換night為NIGHT sed -n 's/night/NIGHT/' a 刪除第7行的# sed '7s/\#//' fstab 把所有的ntp換成the sed 's@ntp@the@g' passwd sed 's#ntp#the#g' passwd sed 's/ntp/the/g' passwd 把的ntp換成the,替換后的結果保存到sed.out sed 's/ntp/the/g w sed.out' passwd 刪除/boot/grub/grub.conf文件中所有以空白開頭的行行首的空白字符; ~]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg 刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符; ~]# sed 's@^#[[:space:]]\+@@' /etc/fstab echo一個絕對路徑給sed命令,取出其基名;取出其目錄名; ~]# echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中; H:把模式空間中的內容追加至保持空間中; g: 從保持空間取出數據覆蓋至模式空間; G:從保持空間取出內容追加至模式空間; x: 把模式空間中的內容與保持空間中的內容進行互換; n: 讀取匹配到的行的下一行至模式空間; N:追加匹配到的行的下一行至模式空間; d: 刪除模式空間中的行; D:刪除多行模式空間中的所有行; sed -n 'n;p' FILE:顯示偶數行 sed '1!G;h;$!d' FILE:逆向顯示文件內容 sed '$!N;$!D' FILE: 取出文件后兩行; sed '$!d' FILE:取出文件最后一行; sed 'G' FILE: 加空白行 sed '/^$/d;G' FILE: 多空白行合并 sed 'n;d' FILE: 顯示奇數行; sed -n '1!G;h;$p' FILE: 逆向顯示文件中的每一行;
一些快速刪除命令
's / \ . $ / / g' 刪除以句點結尾行 '-e /abcd/d' 刪除包含a b c d的行 's / [ ] [ ] [ ] * / [ ] / g' 刪除一個以上空格,用一個空格代替 's / ^ [ ] [ ] * / / g' 刪除行首空格 's / \ . [ ] [ ] * / [ ] / g' 刪除句點后跟兩個或更多空格,代之以一個空格 '/ ^ $ / d' 刪除空行 's / ^ . / / g' 刪除第一個字符 's /CO L \ ( . . . \ ) / / g' 刪除緊跟COL的后三個字母 's / ^ \ / / / g' 從路徑中刪除第一個\ 's / [ ] / [ ] / / g' 刪除所有空格并用tab鍵替代 'S / ^ [ ] / / g' 刪除行首所有tab鍵 's / [ ] * / / g' 刪除所有tab鍵
sed 的一些很有用的替換
顯示/etc/passwd中前5行的用戶名 head -n 5 passwd | sed 's/:.*$//' 將以d或D開頭的行,所有小寫x換成大寫X sed '/^[dD]/s/x/X/g' test 刪除每行最后的兩個字符 sed 's/..$//' test 刪除每行前兩個字符 sed 's/..//' test
&的妙用
[root@localhost ~]# cat b Beijing London [root@localhost ~]# sed 's/B.*/&2008/' b Beijing2008 London [root@localhost ~]# sed 's/Bei/&2008/' b Bei2008jing London
sed中()有深意
echo "hello word" | sed 's/\(hello\).*/word \1/' 定位行范圍 sed -n '/2005/,/2007/p' abc -e選項設置 sed -n -e '1,2p' -e '4p' abc sed -e 's/Beijing/London/g' -e '/Beijing/d' abc -f 選項設定command文件 cat callsed /2004/,/2006/p sed -n -f callsed abc Beijing 2004 Beijing 2005 Beijing 2006 內容插入體驗 在2005行下面插入ins.txt sed '/2005/r ins.txt' abc
sed動作使用
y動作 實現前后字符替換 sed 'y/ei/ie' mysed.txt y///和s///區別 y的語法格式是y/source/dest,表示將source中的字符對位替換為dest中的字符;而s/regexp/replacement/,表示通過正則匹配到的內容替換為replacement部分。 y只是簡單的逐字體換,沒有很多花樣。s支持&符號和預存儲等特性,可以實現更多靈活的替換效果。 sed 'y/ee/ie/' mysed.txt n動作使用 sed '/200/{n;y/eijing/EIJING/;}' mysed.txt Beijing 2003 BEIJING 2004 n隔行替換
原創文章,作者:N21_ Dominic,如若轉載,請注明出處:http://www.www58058.com/56669
是不是還有awk的沒有寫,sed的寫的很棒,期待你的awk的佳作