sed實例收集

一、元字符集   

1)^錨定行的開始 如:/^sed/匹配所有以sed開頭的行。    

2)$ 錨定行的結束 如:/sed$/匹配所有以sed結尾的行。    

3).    匹配一個非換行符的字符 如:/s.d/匹配s後接一個任意字符,然後是d。    

4)*    匹配零或多個字符 如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。   

5)[]   匹配一個指定範圍內的字符,如/[Ss]ed/匹配sed和Sed。   

6)[^]   匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。   

7)\(..\)   保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。   

8)&   保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。    

9)\<      錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。    

10)     \>     錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。    

11)     x\{m\}  重複字符x,m次,如:/0\{5\}/匹配包含5個o的行。    

12)     x\{m,\} 重複字符x,至少m次,如:/o\{5,\}/匹配至少有5個o的行。    

13)     x\{m,n\}重複字符x,至少m次,不多於n次,如:/o\{5,10\}/匹配5--10個o的行。    


二、實例

1)替換:s命令

# sed -e 's/123/1234/' a.txt 

將a.txt文件中所有行中的123用1234替換(-e表示命令以命令行的方式執行;參數s,表示執行替換操作) 

# sed -e '1 s/12/45/' a.txt 
把第一行的12替換成45

 # sed -n 's/^test/mytest/p' example.file 
(-n)選項和p標誌一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它。(^這是正則表達式中表示開頭,該符號後面跟的就是開頭的字符串)(參數p表示打印行) 

# sed -n 's/\(love\)able/\1rs/p' example.file 
love被標記爲1,所有loveable會被替換成lovers,而且替換的行會被打印出來。需要將這條命令分解,s/是表示替換操作,\(love\)表示選中love字符串,\(love\)able/表示包含loveable的行,\(love\)able/\l表示love字符串標記爲1,表示在替換過程中不變。rs/表示替換的目標字符串。這條命令的操作含義:只打印替換了的行 

# sed 's#10#100#g' example.file 
不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符。表示把所有10替換成100

# sed -i 's/now/right now/g' test_sed_command.txt 
表示直接操作文件test_sed_command.txt,將文件test_sed_command.txt中所有的now用right now替換。參數-i,表示直接操作修改文件,不輸出

#echo 112.111 | sed -e 's/\..*//g'

將小數點及之後的內容清除,以上輸出是112(\.表示匹配"."符號,之後跟着.*表示1個到多個字符,如果只是\.*的話,只會匹配"."字符,因爲*號是0個到多個)

#echo aaaa.mpg.bak | sed -e 's;\(.*\..*\)\..*;\1;g'

輸出:aaaa.mpg

# sed 's/^wangpan/&19850715/' example.file 
表示被替換換字符串被找到後,被替換的字符串通過&符號連接給出的字符串組成新字符傳替換被替換的字符串,所有以wangpan開頭的行都會被替換成它自已加19850715,變成wangpan19850715


2)選定行範圍,逗號

# sed -e '3,5 a4' a.txt 
將a.txt文件中的3行到5行之間所有行的後面添加一行內容爲4的行(參數a,表示添加行,參數a後面指定添加的內容) 

# sed -n '/love/,/unlove/p' example.file 
只打印包含love字符串行到包含unlove字符串行之間的所有行(確定行的範圍就是通過逗號實現的 

# sed -n '5,/^wang/p' example 
只打印從第五行開始到第一個包含以wang開始的行之間的所有行 


3)編輯 e命令

#sed --expression='s/test/check/' --expression='/love/d' example.file

一個比-e更好的命令是--expression。它能給sed表達式賦值。  

# sed -e '11,53d' -e 's/wang/pan/' example.file 
(-e)選項允許在同一行裏執行多條命令。如例子所示,第一條命令刪除11至53行,第二條命令用pan替換wang。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。(參數d,表示刪除指定的行)   


4)從文件讀寫:r命令和w命令

# sed '/wangpan/r file' example.file 
file裏的內容被讀進來,顯示在與wangpan匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。參數r,表示讀出文件,後面空格緊跟文件名稱 

# sed -n '/test/w file' example.file 
在example.file中所有包含test的行都被寫入file裏。參數w,表示將匹配的行寫入到指定的文件file中


5)追加和插入命令:a命令和i命令

#sed '/^test/a\this is a example' example.file

'this is a example'被追加到以test開頭的行後面,sed要求命令a後面有一個反斜槓。    
# sed '/test/i\oh! My god!' example.file 
'oh! My god!'被追加到包含test字符串行的前面,參數i表示添加指定內容到匹配行的前面,sed要求參數i後面有一個反斜槓(也可以不加) 


6)變形:y命令

# sed '1,10y/abcde/ABCDE/' example.file 
把1-10行內所有abcde轉變爲大寫,注意,正則表達式元字符不能使用這個命令。參數y,表示把一個字符翻譯爲另外的字符(但是不用於正則表達式) 


7)保持和獲取:h命令和G命令   

# sed -e '/old/h' -e '/girl-friend/G' test_sed_command.txt 
首先了解參數h,拷貝匹配成功行的內容到內存中的緩衝區。在瞭解參數G,獲得內存緩衝區的內容,並追加到當前模板塊文本的後面。上面命令行的含義:將包含old字符串的行的內容保存在緩衝區中,然後將緩衝區的內容拿出來添加到包含girl-friend字符串行的後面。隱含要求蒐集到緩衝區的匹配行在需要添加行的前面


8)保持和互換:h命令和x命令   
# sed -e '/test/h' -e '/wangpan/x' example.file 
將包含test字符串的行的內容保存在緩衝區中,然後再將緩衝區的內容替換包含wangpan字符串的行。參數x,表示行替換操作。隱含要求蒐集到緩衝區的匹配行在需要被替換行的前面


三、收集

1.#sed -e 's/123/1234/' a.txt
將a.txt文件中所有行中的123用1234替換,每行只匹配第一次(-e表示命令以命令行的方式執行;參數s,表示執行替換操作,不改變原文件)


2.#sed -e 's/123/1234/g' a.txt
將a.txt文件中所有行中的123用1234替換,每行匹配多次(-e表示命令以命令行的方式執行;參數s,表示執行替換操作;參數g,表示每行匹配多次,不改變原文件)


3.# sed -e '3,5 a4' a.txt

將a.txt文件中的3行到5行之間所有行的後面添加一行內容爲4的行(參數a,表示添加行,參數a後面指定添加的內容,不改變原文件)


4.# sed -e '1 s/12/45/' a.txt

把第一行的12替換成45(不改變原文件)


5.#sed -i "s/456aaa/444aaa/" `grep 456aaa -lr /mnt/`

在/mnt/share目錄下所有的文件及所有子目錄下的文件中找出包括aaa456的文件(不包括文件夾),將找出來的文件中的456aaa替換成444aaa(-i表示直接改變文件)


6.#sed -n 's/^test/mytest/p' example.file

(-n)選項和p標誌一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印它。(^這是正則表達式中表示開頭,該符號後面跟的就是開頭的字符串)(參數p表示打印行)


7.#sed 's/^wangpan/&19850715/' example.file

表示被替換換字符串被找到後,被替換的字符串通過&符號連接給出的字符串組成新字符傳替換被替換的字符串,所有以wangpan開頭的行都會被替換成它自已加19850715,變成wangpan19850715


8.#sed -n 's/\(love\)able/\1rs/p' example.file

love被標記爲1,所有loveable會被替換成lovers,而且替換的行會被打印出來。需要將這條命令分解,s/是表示替換操作,\(love\)表示選中love字符串,\(love\)able/表示包含loveable的行,\(love\)able/\1表示love字符串標記爲1,表示在替換過程中不變。rs/表示替換的目標字符串。這條命令的操作含義:只打印替換了的行,如果替換字符和被替換字符有部分內容相同,則可用這種標記方法


9.#sed 's#10#100#g' example.file

不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符,但是在一個表達示中,不能把不同字符混合用作分隔符。表示把所有10替換成100。


10.#sed -n '/love/,/unlove/p' example.file

只打印包含love字符串行到包含unlove字符串行之間的所有行,如果找不到unlove,則一直到最後一行(確定行的範圍就是通過逗號實現的)


11.#sed -n '5,/^wang/p' example

只打印從第五行開始到第一個包含以wang開始的行之間的所有行


12.#sed '/love/,/unlove/s/$/jeffery/p' example.file

對於包含love字符串的行到包含unlove字符串之間的行,每行的末尾用字符串jeffery替換。

字符串$/表示以字符串結尾的行,$/表示每一行的結尾,s/$/jeffery/表示每一行的結尾添加jeffery字符串


13.#sed -e '11,53d' -e 's/wang/pan/' example.file
(-e)選項允許在同一行裏執行多條命令。如例子所示,第一條命令刪除11至53行,第二條命令用pan替換wang。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。(參數d,表示刪除指定的行)


14.# sed --expression='s/wang/pan/' --expression='/love/d' example.file

一個比-e更好的命令是--expression。它能給sed表達式賦值。


15.#sed '/wangpan/r file' example.file
file裏的內容被讀進來,顯示在與wangpan匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。參數r,表示讀出文件,後面空格緊跟文件名稱


16.# sed -n '/test/w file' example.file

在example.file中所有包含test的行都被寫入file裏。參數w,表示將匹配的行寫入到指定的文件file中


17.sed '/test/i\oh! My god!' example.file

'oh! My god!'被追加到包含test字符串行的前面,參數i表示添加指定內容到匹配行的前面一行,sed要求參數i後面有一個反斜槓


18.#sed '1,10y/abcde/ABCDE/' example.file

把1—10行內所有abcde轉變爲大寫,注意,正則表達式元字符不能使用這個命令。參數y,表示把一個字符翻譯爲另外的字符(但是不用於正則表達式)


19.#find . -name "*.log" -exec rm -f {} \;

 查找當前目錄及子目錄裏所有的文件,刪除文件名以log爲後綴的文件 -exec可以對find出來的結果執行命令, {} \;代表find出來的結果,除了-name參數外,經常用的還有:

1)-mtime,-ctime,atime都是指按時間查找,-mtime是文件的修改時間,-ctime是文件的創建時間,atime是後找開文件時間;

2)-type 指定查找的文件的類型,它有d,l,b,p,f,c等文件類型,d是查找目錄,l是查找鏈接檔,b是查找塊文件,p是查找管道文件,f是普通文件,c是字符設備文件;

3)-perm 0700 查權限爲700的文件或目錄;

4)-size +512k 查大於512k的文件 ;-size -512k   查小於512k的文件;

5)-mtime +2  兩天以前修改過的文件; -mtime -2 兩天內修改過的文件;-atime -2 兩天內訪問過的文件;-ctime -2 兩天內創建的文件


20. 合併文件裏所有行到一行

sed ':a;N;s/\r\n/ /;ta'  file       # 注意有些是"\r\n",有些只有"\n", 可以用文件編輯器16進制查看是哪種

21. 用sed解析ini文件

parse_ini()
{
    if [ $# -lt 2 ];then
    echo 'Usage:inifile <.ini file> <section> [<key>] [<newvalue>]  # if newvalue marked as "#", it will be deleted'
    exit 1
    fi
    if [ "$3" = "" ];then
       sed -n "/^\[$2\]/,/^\[.*\]/{
       /^\[.*\]/d
       /^[ ]*$/d
       s/;.*$//
       s/#.*$//
       p
       }" $1
    elif [ "$4" = "" ];then
       sed -n "/^\[$2\]/,/^\[.*\]/{
       /^\[.*\]/d
       /^[ ]*$/d
       s/;.*$//
       s/#.*$//
       s/^[ |        ]*$3[ | ]*=[ |   ]*\(.*\)[ |     ]*/\1/p
       }" $1
    else
           if [ "$4" = "#" ];then
                sed "/^\[$2\]/,/^\[.*\]/{
                s/^[ |        ]*$3[ |    ]*=.*/ /
                }" $1 > sed$$
                mv sed$$ $1
           else
                sed "/^\[$2\]/,/^\[.*\]/{
                s/^[ |        ]*$3[ |    ]*=.*/$3=$4/
                }" $1 > sed$$
                mv sed$$ $1
           fi
    fi
}



發佈了36 篇原創文章 · 獲贊 12 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章