sed 手册阅读笔记转
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                sed 手册阅读笔记转
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                
                            
                            
                            原文鏈接
sed 手冊(cè)閱讀筆記摘要sed 手冊(cè)本身不太適合初學(xué)者,我在看的過(guò)程中加了一些 自己的注釋和一些例子,幫助理解,如有偏差或錯(cuò)誤,請(qǐng)指出,多謝。目錄1. sed的工作原理 2. sed中如何選擇特定的行 3. sed的命令行選項(xiàng) 4. sed命令 1. sed的工作原理sed維護(hù)兩個(gè)緩沖區(qū),pattern space和 hold space,命令開(kāi)始執(zhí)行之前都為空。pattern space緩沖區(qū)用于臨時(shí)保存每次讀取的一行的內(nèi)容,大部分的 匹配和替換等等操作都是針對(duì)pattern space中的內(nèi)容進(jìn)行的,因此不會(huì)對(duì)輸 入文件有任何影響;而hold space則作為后備緩沖區(qū)使用。sed針對(duì)輸入中的每一行都會(huì)執(zhí)行一個(gè)系列命令:首先,從標(biāo)準(zhǔn)輸入流 讀取一行,移除換行符,然后存入pattern space中,接著執(zhí)行指定的命令。 每個(gè)命令都有一個(gè)可選的地址(也可能是一個(gè)正則表達(dá)式匹配),這個(gè)地址作 為一個(gè)執(zhí)行前的測(cè)試,指定了需要對(duì)那些行進(jìn)行操作。當(dāng)前行只有匹配的情 況下才會(huì)執(zhí)行命令。當(dāng)指定所有的命令都執(zhí)行完了之后,sed默認(rèn)會(huì)將pattern space中的 內(nèi)容打印到標(biāo)準(zhǔn)輸出中,如果指定了-n選項(xiàng),則會(huì)禁止這種默認(rèn)的打印行為。 如果讀取本行時(shí)移除了行尾的換行符,則在打印了pattern space中的內(nèi)容后 會(huì)再打印一個(gè)換行符。這樣針對(duì)本行的操作就完成了,然后sed會(huì)讀取下一行 的內(nèi)容,再次執(zhí)行相同的操作。非指定了一些特殊的命令(例如D命令),否則pattern space中的內(nèi)容 會(huì)在處理完一行之后刪除,但hold space中的內(nèi)容在處理完每一行時(shí)不會(huì)被 刪除。例 1. 在匹配式樣regex的行之前插入一空行sed '/regex/{x;p;x;}'x Exchange the contents of the hold and pattern spaces.p Print out the pattern space (to the standard output). This command is usually only used in conjunction with the `-n' command-line option.令執(zhí)行過(guò)程如下:先讀入一行,刪除換行符,然后將其保存到 pattern space中,然后用/regex/正則表達(dá)式匹配pattern space中的內(nèi)容, 如果匹配的話則執(zhí)行后續(xù)的命令;如果不匹配則執(zhí)行默認(rèn)的打印pattern space中內(nèi)容的操作,然后讀取下一行。如果匹配的話,第一個(gè)x命令將pattern space和hold space中的內(nèi) 容交換,由于此時(shí)hold space內(nèi)容為空,實(shí)際的效果就是將pattern space的內(nèi)容移動(dòng)到hold space中,然后用p命令打印hold space的內(nèi)容, 由于此時(shí)hold space為空,所以會(huì)打印一個(gè)空行,接著第二個(gè)x命令會(huì)又一 次交換pattern space和holdspace的內(nèi)容,實(shí)際效果是原先讀入的那一行 又會(huì)從hold space移動(dòng)到patternspace中,最后打印此行內(nèi)容。所以以上 命令的結(jié)果就是在每一個(gè)匹配/regex/的行之前插入一個(gè)空行。理解上述命令的關(guān)鍵在于當(dāng)pattern space為空時(shí),p命令會(huì)打印一 個(gè)空行,而不是一個(gè)空字符串。這涉及到sed的工作原理:sed會(huì)在讀入一 行后,去掉行尾的換行符,然后將其內(nèi)容存入pattern space中,打印時(shí)會(huì) 在最后加一個(gè)換行符。所以當(dāng)pattern space為空時(shí),p命令會(huì)先打印一個(gè) 空字符串,然后再打印一個(gè)換行符。2. sed中如何選擇特定的行sed中有一些指定行范圍的方法,用行號(hào)指定和用正則表達(dá)式指定,以 及兩者結(jié)合起來(lái)指定。里面涉及到行號(hào)匹配的時(shí)候,如果指定了 -i或者-s選項(xiàng)的話則是相對(duì)于當(dāng)前文 件。否則是相對(duì)于整個(gè)輸入流。N 匹配輸入中第N行。FIRST~STEP 從第FIRST行開(kāi)始,每隔 STEP行選擇一行。最終選擇行的行號(hào) 等于 FIRST+(N*STEP) 。1~1選擇所有行(在這里沒(méi)什么意義),1~2選擇奇數(shù)行,2~2選擇偶 數(shù)行等等。$ 匹配最后一行。/REGEXP/ 選擇所有匹配這個(gè)正則表達(dá)式的行。\%REGEXP% 同樣是正則表達(dá)式匹配,上面的%可以換成任何字符,主要用 于匹配的內(nèi)容包含大量需要轉(zhuǎn)義的字符的情況下,例如匹配路徑時(shí)。/REGEXP/I, \%REGEXP%I 同上,忽略大小寫(xiě)的正則表達(dá)式匹配。/REGEXP/M, \%REGEXP%M 同上,多行匹配。M表示multi-line。不使用M時(shí),^和$只能 匹配pattern space的開(kāi)始和結(jié)尾的位置,如果使用了M修飾符,且 pattern space中間有換行符的話,^還會(huì)匹配換行符后下一行開(kāi)頭 的位置,$還會(huì)匹配換行符和它之前的字符中間的位置。使用這個(gè)修飾符要注意,它不會(huì)改變sed每 次讀取一行的默認(rèn)行為。正因?yàn)閟ed的默認(rèn)操作行為,一般情況下 pattern space中沒(méi)有換行符。只有在pattern space中間有換行符 的情況下M修飾符才會(huì)有效果,可以通過(guò)N命令來(lái)達(dá)到這個(gè)目的。例 2. 模式匹配時(shí)M修飾符的作用~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc\nd" | sed -n 'N;s/^[a-z]$/X/p' ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc\nd" | sed -n 'N;s/^[a-z]$/X/Mp' X b X d ~/pro/3.System_Config/tools/sed$sed首先將"a"讀入pattern space,接著執(zhí)行N命令,此時(shí) pattern space中的內(nèi)容為"a\nb",第一個(gè)sed命令沒(méi)有使用M修飾符, /^[a-z]$/中的$不能匹配"\n"前面的位置,所以匹配失敗,不執(zhí)行 替換和打印命令。第二個(gè)sed命令使用了M修飾符,成功匹配,即 /^[a-z]$/匹配了"a"(其中的$匹配了"a"和"\n"中間的位置),將其 替換為"X",此時(shí)pattern space中的內(nèi)容為"X\nb",然后用p命令打 印。注意由于在用N命令將"b"所在行加到pattern space的時(shí)候刪去 了"b"所在行尾的換行符,所以在打印完"b"字符后sed會(huì)添加一個(gè)換 行符,就形成了結(jié)果中的前兩行的輸入,后續(xù)的執(zhí)行過(guò)程相同。如果沒(méi)有指定行號(hào)匹配條件,則所有的行都匹配。如果指定了行號(hào) 或者正則表達(dá)式,則只有與之匹配的行才選擇。另外還可以用范圍來(lái)選擇特定的行,范圍是用逗號(hào)分割的兩個(gè)表達(dá) 式,表達(dá)式可以用上面的任意一種方式指定。如果范圍內(nèi)的第二個(gè)值小于 等于第一個(gè)值的話,那么只有與第一個(gè)值所匹配的單行匹配。Gnu sed 支持幾種特殊的指定地址范圍的方法:0,/REGEXP/ 這種方式會(huì)使 /REGEXP/從第一行開(kāi)始匹配,而常規(guī) 的 1,/REGEXP/ 則只能讓/REGEXP/從第二行開(kāi)始匹配。當(dāng)/REGEXP/匹配第一行時(shí),這 兩種方式的差異就會(huì)體現(xiàn)出來(lái)。例 3. 比較 0,/REGEXP/ 和 1,/REGEXP/~/pro/3.System_Config/tools/sed$ cat a.txt abcdef xxx yyy abcdef xxx yyy ~/pro/3.System_Config/tools/sed$ sed -n '1,/abc/p' a.txt abcdef xxx yyy abcdef ~/pro/3.System_Config/tools/sed$ sed -n '0,/abc/p' a.txt abcdefADDR1,+N 匹配從第ADDR1行以及以后 的N行。ADDR1,~N 匹配從第ADDR1行開(kāi)始,直 到N的倍數(shù)行。例 4. 比較 ADDR1,+N 和 ADDR1,~N~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ sed -n '1,+3p' c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ sed -n '1,~3p' c.txt abcdef xxx yyy3. sed的命令行選項(xiàng)-n 默認(rèn)情況下,sed會(huì)打印pattern space中的內(nèi)容,這個(gè)選項(xiàng)禁止 sed的默認(rèn)打印行為。-e SCRIPT 指定欲執(zhí)行的命令,可以同時(shí)指定多個(gè)。sed會(huì)對(duì)pattern space中的內(nèi)容依次執(zhí)行每個(gè)-e選項(xiàng)指定的命令。~/pro/3.System_Config/tools/sed$ echo -e "abc\nbcd\ncde" | sed -n -e '/b/p' -e '/d/p' abc bcd bcd cde 可以看到"bcd"所在的行會(huì)被打印兩次。-f SCRIPT-FILE 指定執(zhí)行文件中的命令。-i [SUFFIX] 沒(méi)有SUFFIX參數(shù)的時(shí)候,默認(rèn)情況下sed不會(huì)修改輸入的源文件, 會(huì)將內(nèi)容打印到標(biāo)準(zhǔn)輸出,使用了這個(gè)選項(xiàng)之后它會(huì)將輸出保存到一 個(gè)臨時(shí)文件,當(dāng)所有命令執(zhí)行完成之后,將臨時(shí)文件重命名為輸入的 源文件。如果指定了SUFFIX,會(huì)將輸入的源文件作一個(gè)備份。當(dāng)SUFFIX 里不包含星號(hào)時(shí),備份的文件名為源文件名+SUFFIX;當(dāng)SUFFIX里含一 個(gè)或者多個(gè)星號(hào)時(shí),會(huì)將星號(hào)替換為源文件名,這種方式可以給備份 文件加上前綴,而不是簡(jiǎn)單地加一個(gè)后綴,甚至SUFFIX里可以包含路 徑名,這樣就可以將源文件備份到另一個(gè)文件夾里(前提是那個(gè)路徑需 存在)。例 5. -i選項(xiàng)的值 SUFFIX不含星號(hào)的情況~/pro/3.System_Config/tools/sed$ ls *c* c.txt ~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ sed -ibackup 's/^.//g' c.txt ~/pro/3.System_Config/tools/sed$ ls *c* c.txt c.txtbackup ~/pro/3.System_Config/tools/sed$ cat c.txt bcdef xx yy zz ~/pro/3.System_Config/tools/sed$ cat c.txtbackup abcdef xxx yyy zzz例 6. -i選項(xiàng)的值 SUFFIX包含星號(hào)的情況~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ ls *c* c.txt ~/pro/3.System_Config/tools/sed$ sed -ibackup* 's/^.//g' c.txt ~/pro/3.System_Config/tools/sed$ ls *c* backupc.txt c.txt ~/pro/3.System_Config/tools/sed$ cat c.txt bcdef xx yy zz ~/pro/3.System_Config/tools/sed$ cat backupc.txt abcdef xxx yyy zzz-l N, --line-length=N 指定用l命令顯示時(shí)的最長(zhǎng)行的長(zhǎng)度,如果文本大于這個(gè)長(zhǎng)度會(huì)被 折行處理。折行時(shí)行尾會(huì)加一個(gè)反斜杠轉(zhuǎn)義換行符。 N的長(zhǎng)度默認(rèn)為70。例 7. -l N選項(xiàng)本例中d.txt只包含一行內(nèi)容,為100個(gè)字符a。~/pro/3.System_Config/tools/sed$ cat d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ~/pro/3.System_Config/tools/sed$ sed -n 'l' d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$ ~/pro/3.System_Config/tools/sed$ sed -n -l 50 'l' d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aa$--posix 相對(duì)于POSIX sed, GNU sed 使用了一些擴(kuò)展的功能,如果指定 這個(gè)選項(xiàng)會(huì)更加方便移植,但同時(shí)會(huì)禁用這些擴(kuò)展功能。-b, --binary 將輸入文件文件當(dāng)作二進(jìn)制文件來(lái)處理。在dos/windows平臺(tái)上, 由于行分隔符是由CR和LF兩個(gè)字符組成,如果不指定這個(gè)選項(xiàng),sed也會(huì) 把這個(gè)兩個(gè)字符的組合當(dāng)成行分隔符。如果指定了這個(gè)選項(xiàng),sed會(huì)將 LF當(dāng)作換行符,這樣CR就成了每行的最后一個(gè)字符。--follow-symlinks 是否跟隨符號(hào)鏈接。這個(gè)選項(xiàng)只在支持符號(hào)鏈接的平臺(tái)上存在, 并且只有同時(shí)使用了-i選項(xiàng)時(shí)才會(huì)起作用。如果輸入 文件是到另一個(gè)文件符號(hào)鏈接,指定了這個(gè)選項(xiàng)會(huì)跟隨符號(hào)鏈接。默認(rèn) 情況下不跟隨。-r, --regexp-extended 使用擴(kuò)展的正則表達(dá)式。-s, --separate 默認(rèn)情況下,sed 會(huì)將命令行指定的所有輸入文件當(dāng)作一個(gè)連續(xù) 的輸入流來(lái)看待。這個(gè)選項(xiàng)會(huì)禁止這個(gè)特征,將文件獨(dú)立對(duì)待,這會(huì)影 響某些匹配選項(xiàng)。例如$默認(rèn)情況下會(huì)匹配整個(gè)輸入流的最后一行,如果 指定了-s選項(xiàng),$會(huì)匹配每個(gè)文件的最后一行。-u, --unbuffered 最小化輸入和輸出的緩沖區(qū)大小。如果輸入是從類似于tail -f這 種管道取得的,這個(gè)選項(xiàng)會(huì)盡可能快地輸出結(jié)果。4. sed命令# 注釋q [EXIT-CODE] 這個(gè)命令只能用于單個(gè)地址的情況。q命令會(huì)讓sed在打印完當(dāng)前pattern space中的內(nèi)容后立即退出, 如果沒(méi)有用-n選項(xiàng)來(lái)禁止默認(rèn)的打印行為的話。使 用可選的 [EXIT-CODE]代碼 作為sed的退出碼。d 刪除當(dāng)前pattern space中的內(nèi)容并立即開(kāi)始下一個(gè)循環(huán),即 sed開(kāi)始處理下一行。p 將當(dāng)前pattern space中的內(nèi)容打印到標(biāo)準(zhǔn)輸入,這個(gè)選項(xiàng)一般 與-n選項(xiàng)一起使用。n n命令會(huì)立即用讀取的下一行的內(nèi)容取代當(dāng)前pattern space中的內(nèi)容。 如果沒(méi)有用-n選項(xiàng)來(lái)禁止默認(rèn)的打印行為的話,n 命令會(huì)先打印完當(dāng)前pattern space中的內(nèi)容。如果到了輸入的末尾, 即不能讀取更多的內(nèi)容,則sed立即退出,不執(zhí)行n之后的命令。{ COMMAND } {和}中間可以包含一組命令,用這種方式可以將這一組命令同 時(shí)作用到某一個(gè)地址上。s/REGEXP/REPLACEMENT/FLAGS 其中的/可以使用其它單個(gè)字符替換。/REPLACEMENT中可以使用一些特 殊的字符,這些字符有特殊的含義。\N 引用前面匹配的第N個(gè)捕 獲性括號(hào)中的內(nèi)容。L 將替換的內(nèi)容都轉(zhuǎn)換成小寫(xiě)字母,直到遇到\U或者\(yùn)E。l 將下一個(gè)字符轉(zhuǎn)換成小寫(xiě)字母。U 將替換的內(nèi)容都轉(zhuǎn)換成大寫(xiě)字母,直到遇到\L或者\(yùn)E。E 停止\L或者\(yùn)U的字母大小寫(xiě)轉(zhuǎn)換。FLAGS為替換命令的修飾符。可 以包含一個(gè)或者多個(gè)以下字符。g 全局替換。默認(rèn)為只替換第一個(gè)匹配的項(xiàng)。NUMBER 替換第NUMBER個(gè)匹配的項(xiàng)。U 將替換的內(nèi)容都轉(zhuǎn)換成大寫(xiě)字母,直到遇到\L或者\(yùn)E。E 停止\L或者\(yùn)U的字母大小寫(xiě)轉(zhuǎn)換。p w FILE-NAME 如果成功替換,將結(jié)果輸出到 FILE-NAME文件中。e 這是GNU sed的一個(gè)擴(kuò)展命令,如果成功執(zhí)行了替換操作, 則替換的結(jié)果會(huì)作為一個(gè)shell命令來(lái)執(zhí)行,然后將命令運(yùn)行的 輸出存入pattern space。~/pro/3.System_Config/tools/sed$ echo "date" | sed -n 's/^//ep' Sat Oct 22 19:46:32 CST 2011 ~/pro/3.System_Config/tools/sed$ cat g.txt ls -l ~/pro/3.System_Config/tools/sed$ sed -n 's/^//ep' g.txt total 156 -rw-r--r-- 1 forfun forfun 67 Oct 17 17:21 Makefile -rw-r--r-- 1 forfun forfun 30 Oct 21 12:33 a.txt ...... -rw-r--r-- 1 forfun forfun 22598 Oct 22 19:49 sed.xml -rw-r--r-- 1 forfun forfun 19550 Oct 21 15:10 sed.xml~ -rw-r--r-- 1 forfun forfun 35130 Oct 8 15:05 sed1line.txt ~$ echo "xxx12yyy" | sed -n -r 's/(.*?)([0-9]+)(.*?)/echo \1; echo \2+1|bc; echo \3/e; s/\n//gp' xxx13yyy I, i 忽略大小寫(xiě)。M, m 即匹配多行,與行匹配的M修飾符作用相同,見(jiàn)M修飾符。y ~/pro/3.System_Config/tools/sed$ echo "abc" | sed 'y/ab/AB/' ABc a\ TEXT ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2a\ > xxx' a xxx b xxx c i\ TEXT ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2i\ > yyy' yyy a yyy b c c\ TEXT ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2c\ > zzz' zzz c ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2=' 1 a 2 b c = ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2=' 1 a 2 b c l N ~/pro/3.System_Config/tools/sed$ echo -e "\t\b"~/pro/3.System_Config/tools/sed$ echo -e "\t\b" | sed 'l' \t\b$~/pro/3.System_Config/tools/sed$ cat d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ~/pro/3.System_Config/tools/sed$ sed -n 'l 40' d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaa$ r FILENAME ~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2r c.txt' a abcdef xxx yyy zzz b abcdef xxx yyy zzz c w FILENAME ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2w h.txt' a b c ~/pro/3.System_Config/tools/sed$ cat h.txt a b D ~/pro/3.System_Config/tools/sed$ cat i.txt abc 123 def456 ghi ~/pro/3.System_Config/tools/sed$ sed '/[a-z]/D' i.txt 123 NP ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc\nd" | sed 'N;P' a a b c c d
                        
                        
                        sed 手冊(cè)閱讀筆記摘要sed 手冊(cè)本身不太適合初學(xué)者,我在看的過(guò)程中加了一些 自己的注釋和一些例子,幫助理解,如有偏差或錯(cuò)誤,請(qǐng)指出,多謝。目錄1. sed的工作原理 2. sed中如何選擇特定的行 3. sed的命令行選項(xiàng) 4. sed命令 1. sed的工作原理sed維護(hù)兩個(gè)緩沖區(qū),pattern space和 hold space,命令開(kāi)始執(zhí)行之前都為空。pattern space緩沖區(qū)用于臨時(shí)保存每次讀取的一行的內(nèi)容,大部分的 匹配和替換等等操作都是針對(duì)pattern space中的內(nèi)容進(jìn)行的,因此不會(huì)對(duì)輸 入文件有任何影響;而hold space則作為后備緩沖區(qū)使用。sed針對(duì)輸入中的每一行都會(huì)執(zhí)行一個(gè)系列命令:首先,從標(biāo)準(zhǔn)輸入流 讀取一行,移除換行符,然后存入pattern space中,接著執(zhí)行指定的命令。 每個(gè)命令都有一個(gè)可選的地址(也可能是一個(gè)正則表達(dá)式匹配),這個(gè)地址作 為一個(gè)執(zhí)行前的測(cè)試,指定了需要對(duì)那些行進(jìn)行操作。當(dāng)前行只有匹配的情 況下才會(huì)執(zhí)行命令。當(dāng)指定所有的命令都執(zhí)行完了之后,sed默認(rèn)會(huì)將pattern space中的 內(nèi)容打印到標(biāo)準(zhǔn)輸出中,如果指定了-n選項(xiàng),則會(huì)禁止這種默認(rèn)的打印行為。 如果讀取本行時(shí)移除了行尾的換行符,則在打印了pattern space中的內(nèi)容后 會(huì)再打印一個(gè)換行符。這樣針對(duì)本行的操作就完成了,然后sed會(huì)讀取下一行 的內(nèi)容,再次執(zhí)行相同的操作。非指定了一些特殊的命令(例如D命令),否則pattern space中的內(nèi)容 會(huì)在處理完一行之后刪除,但hold space中的內(nèi)容在處理完每一行時(shí)不會(huì)被 刪除。例 1. 在匹配式樣regex的行之前插入一空行sed '/regex/{x;p;x;}'x Exchange the contents of the hold and pattern spaces.p Print out the pattern space (to the standard output). This command is usually only used in conjunction with the `-n' command-line option.令執(zhí)行過(guò)程如下:先讀入一行,刪除換行符,然后將其保存到 pattern space中,然后用/regex/正則表達(dá)式匹配pattern space中的內(nèi)容, 如果匹配的話則執(zhí)行后續(xù)的命令;如果不匹配則執(zhí)行默認(rèn)的打印pattern space中內(nèi)容的操作,然后讀取下一行。如果匹配的話,第一個(gè)x命令將pattern space和hold space中的內(nèi) 容交換,由于此時(shí)hold space內(nèi)容為空,實(shí)際的效果就是將pattern space的內(nèi)容移動(dòng)到hold space中,然后用p命令打印hold space的內(nèi)容, 由于此時(shí)hold space為空,所以會(huì)打印一個(gè)空行,接著第二個(gè)x命令會(huì)又一 次交換pattern space和holdspace的內(nèi)容,實(shí)際效果是原先讀入的那一行 又會(huì)從hold space移動(dòng)到patternspace中,最后打印此行內(nèi)容。所以以上 命令的結(jié)果就是在每一個(gè)匹配/regex/的行之前插入一個(gè)空行。理解上述命令的關(guān)鍵在于當(dāng)pattern space為空時(shí),p命令會(huì)打印一 個(gè)空行,而不是一個(gè)空字符串。這涉及到sed的工作原理:sed會(huì)在讀入一 行后,去掉行尾的換行符,然后將其內(nèi)容存入pattern space中,打印時(shí)會(huì) 在最后加一個(gè)換行符。所以當(dāng)pattern space為空時(shí),p命令會(huì)先打印一個(gè) 空字符串,然后再打印一個(gè)換行符。2. sed中如何選擇特定的行sed中有一些指定行范圍的方法,用行號(hào)指定和用正則表達(dá)式指定,以 及兩者結(jié)合起來(lái)指定。里面涉及到行號(hào)匹配的時(shí)候,如果指定了 -i或者-s選項(xiàng)的話則是相對(duì)于當(dāng)前文 件。否則是相對(duì)于整個(gè)輸入流。N 匹配輸入中第N行。FIRST~STEP 從第FIRST行開(kāi)始,每隔 STEP行選擇一行。最終選擇行的行號(hào) 等于 FIRST+(N*STEP) 。1~1選擇所有行(在這里沒(méi)什么意義),1~2選擇奇數(shù)行,2~2選擇偶 數(shù)行等等。$ 匹配最后一行。/REGEXP/ 選擇所有匹配這個(gè)正則表達(dá)式的行。\%REGEXP% 同樣是正則表達(dá)式匹配,上面的%可以換成任何字符,主要用 于匹配的內(nèi)容包含大量需要轉(zhuǎn)義的字符的情況下,例如匹配路徑時(shí)。/REGEXP/I, \%REGEXP%I 同上,忽略大小寫(xiě)的正則表達(dá)式匹配。/REGEXP/M, \%REGEXP%M 同上,多行匹配。M表示multi-line。不使用M時(shí),^和$只能 匹配pattern space的開(kāi)始和結(jié)尾的位置,如果使用了M修飾符,且 pattern space中間有換行符的話,^還會(huì)匹配換行符后下一行開(kāi)頭 的位置,$還會(huì)匹配換行符和它之前的字符中間的位置。使用這個(gè)修飾符要注意,它不會(huì)改變sed每 次讀取一行的默認(rèn)行為。正因?yàn)閟ed的默認(rèn)操作行為,一般情況下 pattern space中沒(méi)有換行符。只有在pattern space中間有換行符 的情況下M修飾符才會(huì)有效果,可以通過(guò)N命令來(lái)達(dá)到這個(gè)目的。例 2. 模式匹配時(shí)M修飾符的作用~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc\nd" | sed -n 'N;s/^[a-z]$/X/p' ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc\nd" | sed -n 'N;s/^[a-z]$/X/Mp' X b X d ~/pro/3.System_Config/tools/sed$sed首先將"a"讀入pattern space,接著執(zhí)行N命令,此時(shí) pattern space中的內(nèi)容為"a\nb",第一個(gè)sed命令沒(méi)有使用M修飾符, /^[a-z]$/中的$不能匹配"\n"前面的位置,所以匹配失敗,不執(zhí)行 替換和打印命令。第二個(gè)sed命令使用了M修飾符,成功匹配,即 /^[a-z]$/匹配了"a"(其中的$匹配了"a"和"\n"中間的位置),將其 替換為"X",此時(shí)pattern space中的內(nèi)容為"X\nb",然后用p命令打 印。注意由于在用N命令將"b"所在行加到pattern space的時(shí)候刪去 了"b"所在行尾的換行符,所以在打印完"b"字符后sed會(huì)添加一個(gè)換 行符,就形成了結(jié)果中的前兩行的輸入,后續(xù)的執(zhí)行過(guò)程相同。如果沒(méi)有指定行號(hào)匹配條件,則所有的行都匹配。如果指定了行號(hào) 或者正則表達(dá)式,則只有與之匹配的行才選擇。另外還可以用范圍來(lái)選擇特定的行,范圍是用逗號(hào)分割的兩個(gè)表達(dá) 式,表達(dá)式可以用上面的任意一種方式指定。如果范圍內(nèi)的第二個(gè)值小于 等于第一個(gè)值的話,那么只有與第一個(gè)值所匹配的單行匹配。Gnu sed 支持幾種特殊的指定地址范圍的方法:0,/REGEXP/ 這種方式會(huì)使 /REGEXP/從第一行開(kāi)始匹配,而常規(guī) 的 1,/REGEXP/ 則只能讓/REGEXP/從第二行開(kāi)始匹配。當(dāng)/REGEXP/匹配第一行時(shí),這 兩種方式的差異就會(huì)體現(xiàn)出來(lái)。例 3. 比較 0,/REGEXP/ 和 1,/REGEXP/~/pro/3.System_Config/tools/sed$ cat a.txt abcdef xxx yyy abcdef xxx yyy ~/pro/3.System_Config/tools/sed$ sed -n '1,/abc/p' a.txt abcdef xxx yyy abcdef ~/pro/3.System_Config/tools/sed$ sed -n '0,/abc/p' a.txt abcdefADDR1,+N 匹配從第ADDR1行以及以后 的N行。ADDR1,~N 匹配從第ADDR1行開(kāi)始,直 到N的倍數(shù)行。例 4. 比較 ADDR1,+N 和 ADDR1,~N~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ sed -n '1,+3p' c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ sed -n '1,~3p' c.txt abcdef xxx yyy3. sed的命令行選項(xiàng)-n 默認(rèn)情況下,sed會(huì)打印pattern space中的內(nèi)容,這個(gè)選項(xiàng)禁止 sed的默認(rèn)打印行為。-e SCRIPT 指定欲執(zhí)行的命令,可以同時(shí)指定多個(gè)。sed會(huì)對(duì)pattern space中的內(nèi)容依次執(zhí)行每個(gè)-e選項(xiàng)指定的命令。~/pro/3.System_Config/tools/sed$ echo -e "abc\nbcd\ncde" | sed -n -e '/b/p' -e '/d/p' abc bcd bcd cde 可以看到"bcd"所在的行會(huì)被打印兩次。-f SCRIPT-FILE 指定執(zhí)行文件中的命令。-i [SUFFIX] 沒(méi)有SUFFIX參數(shù)的時(shí)候,默認(rèn)情況下sed不會(huì)修改輸入的源文件, 會(huì)將內(nèi)容打印到標(biāo)準(zhǔn)輸出,使用了這個(gè)選項(xiàng)之后它會(huì)將輸出保存到一 個(gè)臨時(shí)文件,當(dāng)所有命令執(zhí)行完成之后,將臨時(shí)文件重命名為輸入的 源文件。如果指定了SUFFIX,會(huì)將輸入的源文件作一個(gè)備份。當(dāng)SUFFIX 里不包含星號(hào)時(shí),備份的文件名為源文件名+SUFFIX;當(dāng)SUFFIX里含一 個(gè)或者多個(gè)星號(hào)時(shí),會(huì)將星號(hào)替換為源文件名,這種方式可以給備份 文件加上前綴,而不是簡(jiǎn)單地加一個(gè)后綴,甚至SUFFIX里可以包含路 徑名,這樣就可以將源文件備份到另一個(gè)文件夾里(前提是那個(gè)路徑需 存在)。例 5. -i選項(xiàng)的值 SUFFIX不含星號(hào)的情況~/pro/3.System_Config/tools/sed$ ls *c* c.txt ~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ sed -ibackup 's/^.//g' c.txt ~/pro/3.System_Config/tools/sed$ ls *c* c.txt c.txtbackup ~/pro/3.System_Config/tools/sed$ cat c.txt bcdef xx yy zz ~/pro/3.System_Config/tools/sed$ cat c.txtbackup abcdef xxx yyy zzz例 6. -i選項(xiàng)的值 SUFFIX包含星號(hào)的情況~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ ls *c* c.txt ~/pro/3.System_Config/tools/sed$ sed -ibackup* 's/^.//g' c.txt ~/pro/3.System_Config/tools/sed$ ls *c* backupc.txt c.txt ~/pro/3.System_Config/tools/sed$ cat c.txt bcdef xx yy zz ~/pro/3.System_Config/tools/sed$ cat backupc.txt abcdef xxx yyy zzz-l N, --line-length=N 指定用l命令顯示時(shí)的最長(zhǎng)行的長(zhǎng)度,如果文本大于這個(gè)長(zhǎng)度會(huì)被 折行處理。折行時(shí)行尾會(huì)加一個(gè)反斜杠轉(zhuǎn)義換行符。 N的長(zhǎng)度默認(rèn)為70。例 7. -l N選項(xiàng)本例中d.txt只包含一行內(nèi)容,為100個(gè)字符a。~/pro/3.System_Config/tools/sed$ cat d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ~/pro/3.System_Config/tools/sed$ sed -n 'l' d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$ ~/pro/3.System_Config/tools/sed$ sed -n -l 50 'l' d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aa$--posix 相對(duì)于POSIX sed, GNU sed 使用了一些擴(kuò)展的功能,如果指定 這個(gè)選項(xiàng)會(huì)更加方便移植,但同時(shí)會(huì)禁用這些擴(kuò)展功能。-b, --binary 將輸入文件文件當(dāng)作二進(jìn)制文件來(lái)處理。在dos/windows平臺(tái)上, 由于行分隔符是由CR和LF兩個(gè)字符組成,如果不指定這個(gè)選項(xiàng),sed也會(huì) 把這個(gè)兩個(gè)字符的組合當(dāng)成行分隔符。如果指定了這個(gè)選項(xiàng),sed會(huì)將 LF當(dāng)作換行符,這樣CR就成了每行的最后一個(gè)字符。--follow-symlinks 是否跟隨符號(hào)鏈接。這個(gè)選項(xiàng)只在支持符號(hào)鏈接的平臺(tái)上存在, 并且只有同時(shí)使用了-i選項(xiàng)時(shí)才會(huì)起作用。如果輸入 文件是到另一個(gè)文件符號(hào)鏈接,指定了這個(gè)選項(xiàng)會(huì)跟隨符號(hào)鏈接。默認(rèn) 情況下不跟隨。-r, --regexp-extended 使用擴(kuò)展的正則表達(dá)式。-s, --separate 默認(rèn)情況下,sed 會(huì)將命令行指定的所有輸入文件當(dāng)作一個(gè)連續(xù) 的輸入流來(lái)看待。這個(gè)選項(xiàng)會(huì)禁止這個(gè)特征,將文件獨(dú)立對(duì)待,這會(huì)影 響某些匹配選項(xiàng)。例如$默認(rèn)情況下會(huì)匹配整個(gè)輸入流的最后一行,如果 指定了-s選項(xiàng),$會(huì)匹配每個(gè)文件的最后一行。-u, --unbuffered 最小化輸入和輸出的緩沖區(qū)大小。如果輸入是從類似于tail -f這 種管道取得的,這個(gè)選項(xiàng)會(huì)盡可能快地輸出結(jié)果。4. sed命令# 注釋q [EXIT-CODE] 這個(gè)命令只能用于單個(gè)地址的情況。q命令會(huì)讓sed在打印完當(dāng)前pattern space中的內(nèi)容后立即退出, 如果沒(méi)有用-n選項(xiàng)來(lái)禁止默認(rèn)的打印行為的話。使 用可選的 [EXIT-CODE]代碼 作為sed的退出碼。d 刪除當(dāng)前pattern space中的內(nèi)容并立即開(kāi)始下一個(gè)循環(huán),即 sed開(kāi)始處理下一行。p 將當(dāng)前pattern space中的內(nèi)容打印到標(biāo)準(zhǔn)輸入,這個(gè)選項(xiàng)一般 與-n選項(xiàng)一起使用。n n命令會(huì)立即用讀取的下一行的內(nèi)容取代當(dāng)前pattern space中的內(nèi)容。 如果沒(méi)有用-n選項(xiàng)來(lái)禁止默認(rèn)的打印行為的話,n 命令會(huì)先打印完當(dāng)前pattern space中的內(nèi)容。如果到了輸入的末尾, 即不能讀取更多的內(nèi)容,則sed立即退出,不執(zhí)行n之后的命令。{ COMMAND } {和}中間可以包含一組命令,用這種方式可以將這一組命令同 時(shí)作用到某一個(gè)地址上。s/REGEXP/REPLACEMENT/FLAGS 其中的/可以使用其它單個(gè)字符替換。/REPLACEMENT中可以使用一些特 殊的字符,這些字符有特殊的含義。\N 引用前面匹配的第N個(gè)捕 獲性括號(hào)中的內(nèi)容。L 將替換的內(nèi)容都轉(zhuǎn)換成小寫(xiě)字母,直到遇到\U或者\(yùn)E。l 將下一個(gè)字符轉(zhuǎn)換成小寫(xiě)字母。U 將替換的內(nèi)容都轉(zhuǎn)換成大寫(xiě)字母,直到遇到\L或者\(yùn)E。E 停止\L或者\(yùn)U的字母大小寫(xiě)轉(zhuǎn)換。FLAGS為替換命令的修飾符。可 以包含一個(gè)或者多個(gè)以下字符。g 全局替換。默認(rèn)為只替換第一個(gè)匹配的項(xiàng)。NUMBER 替換第NUMBER個(gè)匹配的項(xiàng)。U 將替換的內(nèi)容都轉(zhuǎn)換成大寫(xiě)字母,直到遇到\L或者\(yùn)E。E 停止\L或者\(yùn)U的字母大小寫(xiě)轉(zhuǎn)換。p w FILE-NAME 如果成功替換,將結(jié)果輸出到 FILE-NAME文件中。e 這是GNU sed的一個(gè)擴(kuò)展命令,如果成功執(zhí)行了替換操作, 則替換的結(jié)果會(huì)作為一個(gè)shell命令來(lái)執(zhí)行,然后將命令運(yùn)行的 輸出存入pattern space。~/pro/3.System_Config/tools/sed$ echo "date" | sed -n 's/^//ep' Sat Oct 22 19:46:32 CST 2011 ~/pro/3.System_Config/tools/sed$ cat g.txt ls -l ~/pro/3.System_Config/tools/sed$ sed -n 's/^//ep' g.txt total 156 -rw-r--r-- 1 forfun forfun 67 Oct 17 17:21 Makefile -rw-r--r-- 1 forfun forfun 30 Oct 21 12:33 a.txt ...... -rw-r--r-- 1 forfun forfun 22598 Oct 22 19:49 sed.xml -rw-r--r-- 1 forfun forfun 19550 Oct 21 15:10 sed.xml~ -rw-r--r-- 1 forfun forfun 35130 Oct 8 15:05 sed1line.txt ~$ echo "xxx12yyy" | sed -n -r 's/(.*?)([0-9]+)(.*?)/echo \1; echo \2+1|bc; echo \3/e; s/\n//gp' xxx13yyy I, i 忽略大小寫(xiě)。M, m 即匹配多行,與行匹配的M修飾符作用相同,見(jiàn)M修飾符。y ~/pro/3.System_Config/tools/sed$ echo "abc" | sed 'y/ab/AB/' ABc a\ TEXT ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2a\ > xxx' a xxx b xxx c i\ TEXT ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2i\ > yyy' yyy a yyy b c c\ TEXT ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2c\ > zzz' zzz c ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2=' 1 a 2 b c = ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2=' 1 a 2 b c l N ~/pro/3.System_Config/tools/sed$ echo -e "\t\b"~/pro/3.System_Config/tools/sed$ echo -e "\t\b" | sed 'l' \t\b$~/pro/3.System_Config/tools/sed$ cat d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ~/pro/3.System_Config/tools/sed$ sed -n 'l 40' d.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ aaaaaaaaaaaaaaaaaaaaaa$ r FILENAME ~/pro/3.System_Config/tools/sed$ cat c.txt abcdef xxx yyy zzz ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2r c.txt' a abcdef xxx yyy zzz b abcdef xxx yyy zzz c w FILENAME ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc" | sed '1,2w h.txt' a b c ~/pro/3.System_Config/tools/sed$ cat h.txt a b D ~/pro/3.System_Config/tools/sed$ cat i.txt abc 123 def456 ghi ~/pro/3.System_Config/tools/sed$ sed '/[a-z]/D' i.txt 123 NP ~/pro/3.System_Config/tools/sed$ echo -e "a\nb\nc\nd" | sed 'N;P' a a b c c d
轉(zhuǎn)載于:https://www.cnblogs.com/happydpc/archive/2012/08/18/sed.html
總結(jié)
以上是生活随笔為你收集整理的sed 手册阅读笔记转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: Atcoder 084D - Small
 - 下一篇: 3 Python os 文件和目录