shell腳本之sed詳解 (sed命令 , sed -e , sed s/ new / old / ... )


shell腳本之sed詳解 (sed命令 , sed -e , sed s/ new / old / ... )

 

(一)

 

Sed是一個非交互性文本流編輯器。它編輯文件或標准輸入導出的文本拷貝。vi中的正則表達式命令在sed中大多可以通用。

##sed常用選項

-e script 指定sed編輯命令

-f scriptfile 指定的文件中是sed編輯命令

-n 寂靜模式,抑制來自sed命令執行過程中的冗余輸出信息,比如只顯示那些被改變的行。

-i[SUFFIX], –in-place[=SUFFIX] 替換和備份源文件

edit files in place (makes backup if extension supplied)

##1. 參數p: 打印匹配行

$ sed -n ’2p’/etc/passwd 打印出第2行 $ sed -n ’1,3p’/etc/passwd 打印出第1到第3行 $ sed -n ‘$p’/etc/passwd 打印出最后一行 $ sed -n ‘/user/p’ /etc/passwd 打印出含有user的行 $ sed -n ‘/\$/p’ /etc/passwd 打印出含有$元字符的行,$意為最后一行 $ sed -n ‘$=’ ok.txt 打印總行數 

##2.參數a和i: 插入文本和附加文本(插入新行)

$ sed -n ‘/FTP/p’/etc/passwd 打印出有FTP的行 $ sed ‘/FTP/a\ 456′ /etc/passwd 在含有FTP的行后面新插入一行,內容為456 $ sed ‘/FTP/i\ 123′ /etc/passwd在含有FTP的行前面新插入一行,內容為123 $ sed ‘/FTP/i\ “123″’ /etc/passwd在含有FTP的行前面新插入一行,內容為”123″ $ sed ’5 a\ 123′ /etc/passwd 在第5行后插入一新行,內容為123 $ sed ’5 i\ “12345″’ /etc/passwd 在第5行前插入一新行,內容為”123表達式45″ 

sed-搜索結果后面增加嵌入代碼

#!/bin/bash #export LANG=zh_CN find ./ -name “*.html” -exec grep 10000008/100 ‘{}’ \; -exec sed -i ‘/10000008/a\<\!--\# include file=\"\/code.html\"--\>‘ {} \; # 

##3.參數d:刪除文本

刪空格

sed -i ‘s/[ ]*//g’ ~/$cid.txt 

刪除無內容空行

sed ‘/^$/d’ file.conf > file.new.conf sed -i ‘/^$/d’ ~/$cid.txt 

刪第一行

sed -i ’1d’ ~/$cid.txt 

刪前兩行

sed -i ’1,2d’ ~/$cid.txt 

del多行

cat SCTP.log |sed ’1d;2d;$d’ 

刪除最后一行:

sed -e ‘$d’ file 

刪除最后兩行:

sed ‘N;$!P;D’ file
sed ‘N;$!P;$!D;$d’ file

刪除最后n行:

$vi sed.sh
$!/bin/bash
A=$(sed -n ‘$=’ file)
sed $(($A-n+1)),${A}d file $ sed ‘/user/d’/etc/passwd 

刪除帶有string的行(del include love row head)

sed -i ‘/^love/d’ file sed -i ‘/love/d’ file 

vi刪除包含strings前4行,后34行

:/strings/-4,+34d 

刪除配置文件中#號注釋行

sed ‘s#\#.*##’ file.conf > file.new.conf sed ‘s,\#.*,,’ 

刪除配置文件中//號注釋行

sed ‘s#//.*##’ file.conf > file.new.conf sed ‘s@//.*@@’ 

刪除由空格和Tab而成的空行

sed ‘/^[[:space:]]*$/d’ file.conf > file.new.conf sed ‘/^[[:space:]]*$/d’ 

刪除尾行的空格

sed -e ‘s/.$//’ file > file.new.conf 

在尾行添加1個空格

sed ‘s/[0-9]$/& /g’ file > flile.new.conf 

##4. 參數s:替換文本,替換命令用替換模式替換指定模式,格式為:

[ a d d r e s s [,address]] s/pattern-to-find/replacement-pattern/[g p w n]
 $ sed ‘s/user/USER/’/etc/passwd 將第1個user替換成USER,g表明全局替換 $ sed ‘s/user/USER/g’/etc/passwd 將所有user替換成USER $ sed ‘s/user/#user/’/etc/passwd 將第1個user替換成#user,如用於屏蔽作用 $ sed ‘s/user//’/etc/passwd 將第1個user替換成空 $ sed ‘s/user/&11111111111111/’/etc/passwd 如果要附加或修改一個很長的字符串,可以使用( &)命令,&命令保存發現模式以便重新調用它,然后把它放在替換字符串里面,這里是把&放前面 $ sed ‘s/user/11111111111111&/’/etc/passwd 這里是將&放后面 在包含字符串test的任意行上,將111替換成222 $ sed ‘/test/s/111/222/g’ sample.txt 

##5. 快速一行正則表達式命令 下面是一些一行命令集。([ ]表示空格,[TAB]表示t a b鍵)

‘s/\ . $//g’ 刪除以句點結尾行 ‘-e/abcd/d’ 刪除包含a b c d的行 ‘s/[ ] [ ] [ ] */[ ]/g’ 刪除一個以上空格,用一個空格代替 ‘s/^ [ ] [ ] *//g’ 刪除行首空格 ‘s/\ . [ ] [ ] */[ ]/g’ 刪除句點后跟兩個或更多空格,代之以一個空格 ‘/^ $/d’ 刪除空行 ‘s/^ .//g’ 刪除第一個字符 ‘s/COL \ ( . . . \ )//g’ 刪除緊跟C O L的后三個字母 ‘s/^ \///g’ 從路徑中刪除第一個\ ‘s/[ ]/[TAB]//g’ 刪除所有空格並用t a b鍵替代 ‘S/^ [TAB]//g’ 刪除行首所有t a b鍵 ‘s/[TAB] *//g’ 刪除所有t a b鍵 

##6、用sed刪除文件中的換行符,殺雞哪需牛刀?

tr -d ‘\n’ file 

真的需要sed

sed -nr ‘ H;
$ {
x; s/\n//g; p }’ 

##7、sed獲取ip

[root@c01 ~]# ifconfig eth0|sed -ne ‘s/^.*addr:\([0-9.]*\).*$/\1/p’ 192.168.100.180 [root@c01 ~]# ifconfig eth0 | sed -e ‘/inet/!d’ -e ‘s/.*addr://’ -e ‘s/[ ].*//’ 192.168.100.180 

##8、\/轉義字符

echo /usr/local/bin | sed ‘s/\/usr\/local\/bin/\/common\/bin/’ find . -name “*.html” |xargs sed -i ‘s#/canApp/evaluation/html/ index.html#http://www.wallcopper.com/eva/#g’ 都可以把當前目錄下的.c .h文件中的TAB替換成4個空格。 find . -name “*.[c|h]” | xargs sed -i ‘s/\t/ /g’ 

##9、參數f:

以下三個命令相等,先在包含字符串test的任意行上,將111替換成222,再將字符f替換成hello

$ sed ‘/test/s/111/222/g ; s/f/hello/g’ sample.txt $ sed -e ‘/test/s/111/222/g’ -e ‘s/f/hello/g’ sample.txt 

選項-f: 將要執行的所以編譯命令放入在文件中

$ more scher
/test/s/111/222/g s/f/hello/g’ sample.txt $ sed -f scher sample.txt 

##10、參數q: 表示跳離sed。最多與一個地址參數配合。

打印出含有a或b字符的行,一旦遇到數字,即刻停止打印。

$ sed -n -e ‘/[0-9]/q’ -e ‘/[a b]/p’ 到china quit sed ‘china/q’ myfile.txt 

##11、參數-i后綴:替換並將源文件備份改后綴

$ sed -i.bak ‘s/123/efg/g’ a.txt 備份源文件 

##12、參數r:在某行插入文件

$ sed -i ’2 r readfile.txt’ writefile.txt 

##13、參數w:讀入文件中的內容存入到另一文件中(temp.txt)。最多與一個地址參數配合。

將sample.txt文件中含test字符串的數據行,copy至temp.txt檔中儲存(原temp.txt中無內容)

$ sed -e ‘/test/w temp.txt’ sample.txt 

##14、參數y:轉換數據中的字符。最多與兩個地址參數配合。

1.將文件中的小寫字母替換成大寫字母。

$ sed -e ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’ sample.txt 

其中前后字符個數必須相同.

##15、參數!:表示不執行函數參數。 將文件中除了important字符串,其余全刪除。

$ sed -e ‘/important/!d’ sample.txt 

##16、參數=:表示印出資料的行數。最多與兩個地址參數配合。 1.印出文件資料並顯示行數。

$ sed -e ‘=’ sample.txt 

計算總行數

$ sed -n ‘$=’ a.txt

##17、其它參數 參數#:表示對文字的注釋。

參數N:表示添加下一筆資料到pattern space內。最多與兩個地址參數配合。(添加下一筆:添加一筆資料后,繼續添加這個資料的下一行數據到pattern space內) 1,將文件中的數據合並。文件內容如下: UNIX LINUX

$ sed -e ‘N’ -e’s/\n/\,/g’ sample.txt 

結果如下: UNIX,LINUX

參數D:表示刪除pattern space內的第一行資料。最多與兩個地址參數配合。

參數P:打印出pattern space內的第一行資料。

$ sed -n -e ‘N’ -e ‘P’ sample.txt 

利用N將下一行資料(即:偶數行)添加到pattern space內,在利用P打印出奇數行。 解釋過程:由於N的作用,使得每次添加一條資料到pattern space后,先不執行操作,而是繼續添加這個資料的下一行到pattern space內, 然后P參數打印出第一行資料。

參數h:表示暫存pattern space的內容至hold space(覆蓋)。最多與兩個地址參數配合。

參數H:表示暫存pattern space的內容至hold space(添加)。最多與兩個地址參數配合。

參數g:表示將hold space的內容放回至pattern space內。(覆蓋掉原pattern space內的數據)

參數G:表示將hold space的內容放回至pattern space內。(添加大到原pattern space數據之后)

將文件中所有空行刪除,並在每一行后面增加一個空行。

$ sed ‘/^$/d;G’ sample.txt

將文件中所有空行刪除,並在每一行后面增加兩個空行。

$ sed ‘/^$/d;G;G’ sample.txt

參數x:表示交換hold space與pattern space內的數據。

將文件第三行的數據替換成第一行的數據。

$ sed -e ’1h’ -e ’3x’ sample.txt 

參數b:

參數t:

如果使用sed對文件進行過濾,最好將問題分成幾步,分步執行,且邊執行邊測試結果。

經驗告訴我們,這是執行一個復雜任務的最有效方式。

參考:

http://www.2cto.com/os/201111/112217.html

http://markmail.org/download.xqy?id=w5pncjwnrs77lz3s&number=2

http://www.grymoire.com/Unix/Sed.html

http://sed.sourceforge.net/sed1line.txt

轉自:

http://www.wallcopper.com/linux/769.html

 

 ( 二 )

一, 基本概述

(1)基本介紹

sed是一款流編輯工具,用來對文本進行過濾與替換工作,  sed通過輸入讀取文件內容,但一次僅讀取一行內容進行某些指令處理后輸出,sed更適合於處理大數據文件。
(2)工作原理

sed在處理文本文件的時候,會在內存上創建一個模式空間,然后把這個文件的每一行調入模式空間用相應的命令處理,處理完輸出;接着處理下一行,直到最后。

(3)與vim的區別

vim需要通知處理文件的哪幾行才會去處理,sed默認會處理文件的所有行,除非你告訴它不處理哪幾行。

二, sed的基本語法

(1)sed [選項]  [定址commands] [inputfile]

關於定址:

定址可以是0個、1個、2個;通知sed去處理文件的哪幾行。

0個:沒有定址,處理文件的所有行

1個:行號,處理行號所在位置的行

2個:行號、正則表達式,處理被行號或正則表達式包起來的行

(2)

選項:

       --version            顯示sed版本hao

       --help               顯示幫助文檔

       -n 關閉默認輸出,默認將自動打印所有行

       -e 多點編輯,允許多個腳本指令被執行。

       -r 支持擴展正則+ ? () {} |

       -i 可以修改原文件,慎用!

       -f 支持使用腳本

命令:

       p打印行

       d        刪除行

       s           替換

       n替換第幾個匹內容

       w另存為

       a         之后添加一行

       i         當前行之前插入文本

       y        替換匹配內容

 

三, 實際案例講解

(1)p(與-n合用)

查看passwd文件的1~3行

@1,打印一到三行

[root@tx3 ~]# cp /etc/passwd /t1

[root@tx3 ~]#  cat -n t1 | sed  -n '1,3p'

    1root:x:0:0:root:/root:/bin/bash

    2bin:x:1:1:bin:/bin:/sbin/nologin

    3daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

@2,查看passwd文件的lp~halt行

[root@tx3 ~]#  cat -n t1 |sed -n '/lp/,/halt/p'

    5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    6sync:x:5:0:sync:/sbin:/bin/sync

    7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    8halt:x:7:0:halt:/sbin:/sbin/halt

@3, 打印基數行(從第一行開始,每隔一行一輸出)

@4,打印uid是0或1的行

[root@tx3 ~]# sed -n '/x:[01]:/p' t1

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

 

(2)d 刪除

@1,刪除第一行

@2,刪除第一行和第三行(與-e選項合用)

@3,;選項的使用和-e一樣

@4,取反:!

[root@tx3 ~]#  cat -n t1 | sed '1!d'

    1root:x:0:0:root:/root:/bin/bash

(3)s 查找替換 s///

語法:

       '[address]s/pattern/replacement/flags'

                       old     new

flags:

           n:1-512 之間的正整數,表示替換模式里面出現的第幾次內容

           p:打印

           g:全局修改

           w:另存為

       這幾個選項是可以復合使用的,但是寫的要有意義。(pg ;nw)

注:這里為部分截取

@1默認會替換行里面的第1個匹配

[root@tx3 ~]# sed 's/root/ROOT/' t1

ROOT:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

@2全部替換

[root@tx3 ~]# sed 's/root/ROOT/g' t1

ROOT:x:0:0:ROOT:/ROOT:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

@3替換第2個匹配

[root@tx3 ~]# sed 's/root/ROOT/2' t1

root:x:0:0:ROOT:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

@4打印

[root@tx3 ~]# sed 's/root/ROOT/p' t1

ROOT:x:0:0:root:/root:/bin/bash

ROOT:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin‘

[root@tx3 ~]# sed -n 's/root/ROOT/p' t1

ROOT:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/ROOT:/sbin/nologin

@5另存為

[root@tx3 ~]# sed -n 's/root/ROOT/w /tx' t1

[root@tx3 ~]# cat /tx

ROOT:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/ROOT:/sbin/nologin

@6在文件的每行前面添加 # 注釋

[root@tx3 ~]# sed 's/^/#/' t1

#root:x:0:0:root:/root:/bin/bash

#bin:x:1:1:bin:/bin:/sbin/nologin

#daemon:x:2:2:daemon:/sbin:/sbin/nologin

@7刪掉文件的第1個字符

[root@tx3 ~]# sed 's/^.//1' t1

oot:x:0:0:root:/root:/bin/bash

in:x:1:1:bin:/bin:/sbin/nologin

aemon:x:2:2:daemon:/sbin:/sbin/nologin

 

@8刪掉文件的第2個字符

[root@tx3 ~]# sed 's/.//2' t1

rot:x:0:0:root:/root:/bin/bash

bn:x:1:1:bin:/bin:/sbin/nologin

 

(4)i 從當前行插入

在第一行前插入hello

[root@tx3 ~]# sed '1i hello' t1

hello

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

(5)a 從當前行后添加

在第一行后添加hello

[root@tx3 ~]# sed '1a hello' t1

root:x:0:0:root:/root:/bin/bash

hello

bin:x:1:1:bin:/bin:/sbin/nologin

 

(6)-r 支持擴展正則

[root@tx3 ~]# sed -r 's/^(.)(.)/\1/' t1

rot:x:0:0:root:/root:/bin/bash      //相當於把前兩個字符替換成第一個字符,這樣就實現了刪除第二個字符

bn:x:1:1:bin:/bin:/sbin/nologin

demon:x:2:2:daemon:/sbin:/sbin/nologin

其他方法:

@1#sed 's/.//2' t1

@2#sed 's/^..../\1/' t1

 

(7)y 替換,按照位置來匹配替換  y///      不識別re

 

[root@tx3 ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' t1

ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH

BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN

DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN

(8)替換匹配行

@1[root@tx3 ~]# sed -n '1c ROOT' t1

ROOT

(9)q 退出

[root@tx3 ~]# sed '1q ' t1

root:x:0:0:root:/root:/bin/bash

(10)-i        可以修改原文件

(11)-f 支持腳本

四.sed如何處理數據

 

    PATT:模式空間,處理文件的輸入行,處理文件的空間,最多保存8192字節,相當於車間sed把流內容在這里處理。

    HOLD:保留空間,用來保存已經處理的輸入行;最多保存8192字節;默認有一個空行,相當於倉庫,加工的半成品在這里臨時儲存。

 

COMM:命令

h:將模式空間里的內容,復制到保留空間里,覆蓋原來的內容 >

H:將模式空間里的內容,追加到保留空間里,保留原來的內容 >>

g:將保留空間里的內容,復制到模式空間里,覆蓋原來的內容

G:將保留空間里的內容,追加到模式空間里,保留原來的內容

n:對匹配行的下一行進行處理

x:交換模式空間和保留空間的內容

(1)h;G

@1.將第一行的內容放到打三行后面

@2.在每行的后面添加1個空行

注:1.保留空間里默認有一個空白行。2,‘G’默認處理全局

@3.把第1行到第4行的數據復制到第5行后面

注:1h是為了覆蓋保留空間里的空白行

@4. 把第1行到第4行的數據剪切到第5行后面

(2)n    對匹配行的下一行進行處理

(3)x     交換模式空間和保留空間的內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM