日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sed 手册阅读笔记转

發布時間:2023/12/9 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sed 手册阅读笔记转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文鏈接
sed 手冊閱讀筆記摘要sed 手冊本身不太適合初學者,我在看的過程中加了一些 自己的注釋和一些例子,幫助理解,如有偏差或錯誤,請指出,多謝。目錄1. sed的工作原理 2. sed中如何選擇特定的行 3. sed的命令行選項 4. sed命令 1. sed的工作原理sed維護兩個緩沖區,pattern space和 hold space,命令開始執行之前都為空。pattern space緩沖區用于臨時保存每次讀取的一行的內容,大部分的 匹配和替換等等操作都是針對pattern space中的內容進行的,因此不會對輸 入文件有任何影響;而hold space則作為后備緩沖區使用。sed針對輸入中的每一行都會執行一個系列命令:首先,從標準輸入流 讀取一行,移除換行符,然后存入pattern space中,接著執行指定的命令。 每個命令都有一個可選的地址(也可能是一個正則表達式匹配),這個地址作 為一個執行前的測試,指定了需要對那些行進行操作。當前行只有匹配的情 況下才會執行命令。當指定所有的命令都執行完了之后,sed默認會將pattern space中的 內容打印到標準輸出中,如果指定了-n選項,則會禁止這種默認的打印行為。 如果讀取本行時移除了行尾的換行符,則在打印了pattern space中的內容后 會再打印一個換行符。這樣針對本行的操作就完成了,然后sed會讀取下一行 的內容,再次執行相同的操作。非指定了一些特殊的命令(例如D命令),否則pattern space中的內容 會在處理完一行之后刪除,但hold space中的內容在處理完每一行時不會被 刪除。例 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.令執行過程如下:先讀入一行,刪除換行符,然后將其保存到 pattern space中,然后用/regex/正則表達式匹配pattern space中的內容, 如果匹配的話則執行后續的命令;如果不匹配則執行默認的打印pattern space中內容的操作,然后讀取下一行。如果匹配的話,第一個x命令將pattern space和hold space中的內 容交換,由于此時hold space內容為空,實際的效果就是將pattern space的內容移動到hold space中,然后用p命令打印hold space的內容, 由于此時hold space為空,所以會打印一個空行,接著第二個x命令會又一 次交換pattern space和holdspace的內容,實際效果是原先讀入的那一行 又會從hold space移動到patternspace中,最后打印此行內容。所以以上 命令的結果就是在每一個匹配/regex/的行之前插入一個空行。理解上述命令的關鍵在于當pattern space為空時,p命令會打印一 個空行,而不是一個空字符串。這涉及到sed的工作原理:sed會在讀入一 行后,去掉行尾的換行符,然后將其內容存入pattern space中,打印時會 在最后加一個換行符。所以當pattern space為空時,p命令會先打印一個 空字符串,然后再打印一個換行符。2. sed中如何選擇特定的行sed中有一些指定行范圍的方法,用行號指定和用正則表達式指定,以 及兩者結合起來指定。里面涉及到行號匹配的時候,如果指定了 -i或者-s選項的話則是相對于當前文 件。否則是相對于整個輸入流。N 匹配輸入中第N行。FIRST~STEP 從第FIRST行開始,每隔 STEP行選擇一行。最終選擇行的行號 等于 FIRST+(N*STEP) 。1~1選擇所有行(在這里沒什么意義),1~2選擇奇數行,2~2選擇偶 數行等等。$ 匹配最后一行。/REGEXP/ 選擇所有匹配這個正則表達式的行。\%REGEXP% 同樣是正則表達式匹配,上面的%可以換成任何字符,主要用 于匹配的內容包含大量需要轉義的字符的情況下,例如匹配路徑時。/REGEXP/I, \%REGEXP%I 同上,忽略大小寫的正則表達式匹配。/REGEXP/M, \%REGEXP%M 同上,多行匹配。M表示multi-line。不使用M時,^和$只能 匹配pattern space的開始和結尾的位置,如果使用了M修飾符,且 pattern space中間有換行符的話,^還會匹配換行符后下一行開頭 的位置,$還會匹配換行符和它之前的字符中間的位置。使用這個修飾符要注意,它不會改變sed每 次讀取一行的默認行為。正因為sed的默認操作行為,一般情況下 pattern space中沒有換行符。只有在pattern space中間有換行符 的情況下M修飾符才會有效果,可以通過N命令來達到這個目的。例 2. 模式匹配時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,接著執行N命令,此時 pattern space中的內容為"a\nb",第一個sed命令沒有使用M修飾符, /^[a-z]$/中的$不能匹配"\n"前面的位置,所以匹配失敗,不執行 替換和打印命令。第二個sed命令使用了M修飾符,成功匹配,即 /^[a-z]$/匹配了"a"(其中的$匹配了"a"和"\n"中間的位置),將其 替換為"X",此時pattern space中的內容為"X\nb",然后用p命令打 印。注意由于在用N命令將"b"所在行加到pattern space的時候刪去 了"b"所在行尾的換行符,所以在打印完"b"字符后sed會添加一個換 行符,就形成了結果中的前兩行的輸入,后續的執行過程相同。如果沒有指定行號匹配條件,則所有的行都匹配。如果指定了行號 或者正則表達式,則只有與之匹配的行才選擇。另外還可以用范圍來選擇特定的行,范圍是用逗號分割的兩個表達 式,表達式可以用上面的任意一種方式指定。如果范圍內的第二個值小于 等于第一個值的話,那么只有與第一個值所匹配的單行匹配。Gnu sed 支持幾種特殊的指定地址范圍的方法:0,/REGEXP/ 這種方式會使 /REGEXP/從第一行開始匹配,而常規 的 1,/REGEXP/ 則只能讓/REGEXP/從第二行開始匹配。當/REGEXP/匹配第一行時,這 兩種方式的差異就會體現出來。例 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行開始,直 到N的倍數行。例 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的命令行選項-n 默認情況下,sed會打印pattern space中的內容,這個選項禁止 sed的默認打印行為。-e SCRIPT 指定欲執行的命令,可以同時指定多個。sed會對pattern space中的內容依次執行每個-e選項指定的命令。~/pro/3.System_Config/tools/sed$ echo -e "abc\nbcd\ncde" | sed -n -e '/b/p' -e '/d/p' abc bcd bcd cde 可以看到"bcd"所在的行會被打印兩次。-f SCRIPT-FILE 指定執行文件中的命令。-i [SUFFIX] 沒有SUFFIX參數的時候,默認情況下sed不會修改輸入的源文件, 會將內容打印到標準輸出,使用了這個選項之后它會將輸出保存到一 個臨時文件,當所有命令執行完成之后,將臨時文件重命名為輸入的 源文件。如果指定了SUFFIX,會將輸入的源文件作一個備份。當SUFFIX 里不包含星號時,備份的文件名為源文件名+SUFFIX;當SUFFIX里含一 個或者多個星號時,會將星號替換為源文件名,這種方式可以給備份 文件加上前綴,而不是簡單地加一個后綴,甚至SUFFIX里可以包含路 徑名,這樣就可以將源文件備份到另一個文件夾里(前提是那個路徑需 存在)。例 5. -i選項的值 SUFFIX不含星號的情況~/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選項的值 SUFFIX包含星號的情況~/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命令顯示時的最長行的長度,如果文本大于這個長度會被 折行處理。折行時行尾會加一個反斜杠轉義換行符。 N的長度默認為70。例 7. -l N選項本例中d.txt只包含一行內容,為100個字符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 相對于POSIX sed, GNU sed 使用了一些擴展的功能,如果指定 這個選項會更加方便移植,但同時會禁用這些擴展功能。-b, --binary 將輸入文件文件當作二進制文件來處理。在dos/windows平臺上, 由于行分隔符是由CR和LF兩個字符組成,如果不指定這個選項,sed也會 把這個兩個字符的組合當成行分隔符。如果指定了這個選項,sed會將 LF當作換行符,這樣CR就成了每行的最后一個字符。--follow-symlinks 是否跟隨符號鏈接。這個選項只在支持符號鏈接的平臺上存在, 并且只有同時使用了-i選項時才會起作用。如果輸入 文件是到另一個文件符號鏈接,指定了這個選項會跟隨符號鏈接。默認 情況下不跟隨。-r, --regexp-extended 使用擴展的正則表達式。-s, --separate 默認情況下,sed 會將命令行指定的所有輸入文件當作一個連續 的輸入流來看待。這個選項會禁止這個特征,將文件獨立對待,這會影 響某些匹配選項。例如$默認情況下會匹配整個輸入流的最后一行,如果 指定了-s選項,$會匹配每個文件的最后一行。-u, --unbuffered 最小化輸入和輸出的緩沖區大小。如果輸入是從類似于tail -f這 種管道取得的,這個選項會盡可能快地輸出結果。4. sed命令# 注釋q [EXIT-CODE] 這個命令只能用于單個地址的情況。q命令會讓sed在打印完當前pattern space中的內容后立即退出, 如果沒有用-n選項來禁止默認的打印行為的話。使 用可選的 [EXIT-CODE]代碼 作為sed的退出碼。d 刪除當前pattern space中的內容并立即開始下一個循環,即 sed開始處理下一行。p 將當前pattern space中的內容打印到標準輸入,這個選項一般 與-n選項一起使用。n n命令會立即用讀取的下一行的內容取代當前pattern space中的內容。 如果沒有用-n選項來禁止默認的打印行為的話,n 命令會先打印完當前pattern space中的內容。如果到了輸入的末尾, 即不能讀取更多的內容,則sed立即退出,不執行n之后的命令。{ COMMAND } {和}中間可以包含一組命令,用這種方式可以將這一組命令同 時作用到某一個地址上。s/REGEXP/REPLACEMENT/FLAGS 其中的/可以使用其它單個字符替換。/REPLACEMENT中可以使用一些特 殊的字符,這些字符有特殊的含義。\N 引用前面匹配的第N個捕 獲性括號中的內容。L 將替換的內容都轉換成小寫字母,直到遇到\U或者\E。l 將下一個字符轉換成小寫字母。U 將替換的內容都轉換成大寫字母,直到遇到\L或者\E。E 停止\L或者\U的字母大小寫轉換。FLAGS為替換命令的修飾符。可 以包含一個或者多個以下字符。g 全局替換。默認為只替換第一個匹配的項。NUMBER 替換第NUMBER個匹配的項。U 將替換的內容都轉換成大寫字母,直到遇到\L或者\E。E 停止\L或者\U的字母大小寫轉換。p w FILE-NAME 如果成功替換,將結果輸出到 FILE-NAME文件中。e 這是GNU sed的一個擴展命令,如果成功執行了替換操作, 則替換的結果會作為一個shell命令來執行,然后將命令運行的 輸出存入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 忽略大小寫。M, m 即匹配多行,與行匹配的M修飾符作用相同,見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

轉載于:https://www.cnblogs.com/happydpc/archive/2012/08/18/sed.html

總結

以上是生活随笔為你收集整理的sed 手册阅读笔记转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。