Linux学习笔记Sed最全整理
本文分為四部分,前兩部分都是比較基礎的用法。
如果你對Sed感興趣的話,可以去嘗試讀一下后面幾個章節(jié)。
你完全可以根據你的水平去選擇其中的某一個章節(jié)閱讀。
目錄
- 目錄
- 初級入門
- 主要應用場景
- 刪除
- 查找替換
- 字符轉換
- 插入文本
- 鳥哥私房菜
- Sed到底是如何工作的
- 高級用法
- 高級應用實例
- 編號
- 文本轉換和替代
- 選擇性地顯示特定行
- 選擇性地刪除特定行
- 特殊應用
- BSD版本Sed的文檔
初級入門
sed工具是一種非交互式的流編輯器。默認情況下只會影響輸出,不會改變輸入。sed處理文檔時是以行為單位的。功能有:刪除、查找替換、添加、插入、從其他文件讀取。
其實這些功能看起來都可以用vim等編輯器來實現。那么,為什么要有sed呢?
主要應用場景
- 太過龐大的文本
- 有規(guī)律的文本修改
sed的命令格式
sed [option] command [file ...]刪除
#刪除第一行 sed '1d' file注意,這只影響到輸出流。如果想保存的話
sed -i '1d' filename或者
#輸出到新文件 sed '1d'>newfilename其中1d命令中,我們把1稱為地址,這里指代的是第一行。
刪除第一行到最后一行
刪除包含了某個pattern的行
sed '/pattern/d' filename #例如 sed '/^$/d' filename查找替換
#普通替換 將每行的第一個line替換成LINE sed 's/line/LINE/' filenamesed ‘s/line/LINE/[number]
表示對這一行來說至多替換number個line,如果number為g,則全部替換
字符轉換
現在還沒有見過重要的用法插入文本
#在第二行前插入一行 sed '2 i insert_context' filename #在第二行之后插入一行 sed '2 a insert_context' filename #在匹配的行之前插入一行 sed '/pattern/i\new_word' filename打印
#只打印出第一行 ,不加n的話會默認輸出每一行 sed -n '1p' filename #只打印出被修改的一行 sed -n 's/the/THE/p' filename鳥哥私房菜
sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區(qū)中的內容,處理完成后,把緩沖區(qū)的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
[root@www ~]# sed [-nefr] [動作]
選項與參數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作;
-r :sed 的動作支持的是延伸型正規(guī)表示法的語法。(默認是基礎正規(guī)表示法語法)
-i :直接修改讀取的文件內容,而不是輸出到終端。
動作說明: [n1[,n2]]function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』
function:
a :新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦!
sed使用參數
重點,命令的拼接
#數據的搜尋并執(zhí)行命令 #找到匹配模式eastern的行后,#搜索/etc/passwd,找到root對應的行,執(zhí)行后面花括號中的一組命令,每個命令之間用分號分隔,這里把bash替換為blueshell,再輸出這行: nl /etc/passwd | sed '/root/{s/bash/blueshell;p}'多點編輯
#多點編輯 #一條sed命令,刪除/etc/passwd第三行到末尾的數據,并把bash替換為#blueshell nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell'直接修改文件內容(危險動作)
sed 可以直接修改文件的內容,不必使用管道命令或數據流重導向! 不過,由於這個動作會直接修改到原始的文件,所以請你千萬不要隨便拿系統(tǒng)配置來測試! 我們還是使用下載的 regular_express.txt 文件來測試看看吧!
利用 sed 將 regular_express.txt 內每一行結尾若為 . 則換成 !
#注意,由于.和!都是正則表達符,所以需要轉義 sed -i 's/\.$/\!/g regular_express.txt'利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』
sed -i '$i #this is a test' regular_express.txtSed到底是如何工作的?
這里有一個比較不錯的文章,可以看到Linux和Unix版本之間的區(qū)別以及簡略的用法。
如果沒有耐心看看上面的內容是完全足夠了的。
本文作者的水平實在平平。只能試著翻譯一下文檔。但是如果沒有辦法讀原始文檔,那么我就只能永遠看翻譯過來的不知所云的文章。我認為這一步是必須的。
可能文檔也并不足夠,有些概念沒有解釋清楚。先看看這段話再讀文檔好了:)
How `sed' Works ===================`sed' maintains two data buffers: the active _pattern_ space, and the auxiliary _hold_ space. Both are initially empty.`sed' operates by performing the following cycle on each lines of input: first, `sed' reads one line from the input stream, removes any trailing newline, and places it in the pattern space. Then commands are executed; each command can have an address associated to it:addresses are a kind of condition code, and a command is only executed if the condition is verified before the command is to be executed.When the end of the script is reached, unless the `-n' option is in use, the contents of pattern space are printed out to the output stream, adding back the trailing newline if it was removed.(1) Then the next cycle starts for the next input line.Unless special commands (like `D') are used, the pattern space is deleted between two cycles. The hold space, on the other hand, keeps its data between cycles (see commands `h', `H', `x', `g', `G' to move data between both buffers).---------- Footnotes ----------(1) Actually, if `sed' prints a line without the terminating newline, it will nevertheless print the missing newline as soon as more text is sent to the same output stream, which gives the "least expected surprise" even though it does not make commands like `sed -n p' exactly identical to `cat'.簡單地說就是:
先讀入一行,去掉尾部換行,把處理過的這行存入pattern space這個變量,再當空間里的某些地址存在時,執(zhí)行命令 這兩步執(zhí)行完畢,把現在的pattern space打印出來,在后邊打印曾去掉的換行 把pattern space內容給hold space,把pattern space置空 讀下一行有了pattern space和hold space的基礎,讀下面這篇文檔就會輕松很多。
高級用法
如果你沒有看上面的文檔,那么看看這篇《【轉】sed命令n,N,d,D,p,P,h,H,g,G,x解析》
1、sed執(zhí)行模板=sed '模式{命令1;命令2}'即逐行讀入模式空間,執(zhí)行命令,最后輸出打印出來2、為方便下面,先說下p和P,p打印當前模式空間內容,追加到默認輸出之后,P打印當前模式空間開端至\n的內容,并追加到默認輸出之前。sed并不對每行末尾\n進行處理,但是對N命令追加的行間\n進行處理,因為此時sed將兩行看做一行。2-1、n命令n命令簡單來說就是提前讀取下一行,覆蓋模型空間前一行(并沒有刪除,因此依然打印至標準輸出),如果命令未執(zhí)行成功(并非跳過:前端條件不匹配),則放棄之后的任何命令,并對新讀取的內容,重頭執(zhí)行sed。2-2、N命令N命令簡單來說就是追加下一行到模式空間,同時將兩行看做一行,但是兩行之間依然含有\(zhòng)n換行符,如果命令未執(zhí)行成功(并非跳過:前端條件不匹配),則放棄之后任何命令,并對新讀取的內容,重頭執(zhí)行sed。2-3、d命令d命令是刪除當前模式空間內容(不在傳至標準輸出),并放棄之后的命令,并對新讀取的內容,重頭執(zhí)行sed。2-4、D命令D命令是刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執(zhí)行sed。2-5、y命令y命令的作用在于字符轉換2-6、h命令,H命令,g命令,G命令h命令是將當前模式空間中內容覆蓋至保持空間,H命令是將當前模式空間中的內容追加至保持空間g命令是將當前保持空間中內容覆蓋至模式空間,G命令是將當前保持空間中的內容追加至模式空間2-7、x命令x命令是將當前保持空間和模式空間內容互換高級應用實例
# 在每一行后面增加一空行# 因為holdspace一直為空,所以G命令只是在加空行罷了sed G# 將原來的所有空行刪除并在每一行后面增加一空行。# 這樣在輸出的文本中每一行后面將有且只有一空行。sed '/^$/d;G'# 在每一行后面增加兩行空行sed 'G;G'# 將第一個腳本所產生的所有空行刪除(即刪除所有偶數行)sed 'n;d'# 在匹配式樣“regex”的行之前插入一空行sed '/regex/{x;p;x;}'# 在匹配式樣“regex”的行之后插入一空行sed '/regex/G'# 在匹配式樣“regex”的行之前和之后各插入一空行sed '/regex/{x;p;x;G;}'編號:
N
Append the next line of input to the pattern space, using an embedded newline character to separate the appended material from the original contents. Note that the current line number changes.
文本轉換和替代:
--------# Unix環(huán)境:轉換DOS的新行符(CR/LF)為Unix格式。sed 's/.$//' # 假設所有行以CR/LF結束sed 's/^M$//' # 在bash/tcsh中,將按Ctrl-M改為按Ctrl-Vsed 's/\x0D$//' # ssed、gsed 3.02.80,及更高版本# Unix環(huán)境:轉換Unix的新行符(LF)為DOS格式。sed "s/$/`echo -e \\\r`/" # 在ksh下所使用的命令sed 's/$'"/`echo \\\r`/" # 在bash下所使用的命令sed "s/$/`echo \\\r`/" # 在zsh下所使用的命令sed 's/$/\r/' # gsed 3.02.80 及更高版本# DOS環(huán)境:轉換Unix新行符(LF)為DOS格式。sed "s/$//" # 方法 1sed -n p # 方法 2# DOS環(huán)境:轉換DOS新行符(CR/LF)為Unix格式。# 下面的腳本只對UnxUtils sed 4.0.7 及更高版本有效。要識別UnxUtils版本的# sed可以通過其特有的“--text”選項。你可以使用幫助選項(“--help”)看# 其中有無一個“--text”項以此來判斷所使用的是否是UnxUtils版本。其它DOS# 版本的的sed則無法進行這一轉換。但可以用“tr”來實現這一轉換。sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本tr -d \r infile >outfile # GNU tr 1.22 或更高版本# 將每一行前導的“空白字符”(空格,制表符)刪除# 使之左對齊sed 's/^[ \t]*//' # 見本文末尾關于'\t'用法的描述# 將每一行拖尾的“空白字符”(空格,制表符)刪除sed 's/[ \t]*$//' # 見本文末尾關于'\t'用法的描述# 將每一行中的前導和拖尾的空白字符刪除sed 's/^[ \t]*//;s/[ \t]*$//'# 在每一行開頭處插入5個空格(使全文向右移動5個字符的位置)sed 's/^/ /'# 以79個字符為寬度,將所有文本右對齊sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # 78個字符外加最后的一個空格# 以79個字符為寬度,使所有文本居中。在方法1中,為了讓文本居中每一行的前# 頭和后頭都填充了空格。 在方法2中,在居中文本的過程中只在文本的前面填充# 空格,并且最終這些空格將有一半會被刪除。此外每一行的后頭并未填充空格。sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # 方法1sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # 方法2# 在每一行中查找字串“foo”,并將找到的“foo”替換為“bar”sed 's/foo/bar/' # 只替換每一行中的第一個“foo”字串sed 's/foo/bar/4' # 只替換每一行中的第四個“foo”字串sed 's/foo/bar/g' # 將每一行中的所有“foo”都換成“bar”sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替換倒數第二個“foo”sed 's/\(.*\)foo/\1bar/' # 替換最后一個“foo”# 只在行中出現字串“baz”的情況下將“foo”替換成“bar”sed '/baz/s/foo/bar/g'# 將“foo”替換成“bar”,并且只在行中未出現字串“baz”的情況下替換sed '/baz/!s/foo/bar/g'# 不管是“scarlet”“ruby”還是“puce”,一律換成“red”sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #對多數的sed都有效gsed 's/scarlet\|ruby\|puce/red/g' # 只對GNU sed有效# 倒置所有行,第一行成為最后一行,依次類推(模擬“tac”)。# 由于某些原因,使用下面命令時HHsed v1.5會將文件中的空行刪除sed '1!G;h;$!d' # 方法1sed -n '1!G;h;$p' # 方法2# 將行中的字符逆序排列,第一個字成為最后一字,……(模擬“rev”)sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'# 將每兩行連接成一行(類似“paste”)sed '$!N;s/\n/ /'# 如果當前行以反斜杠“\”結束,則將下一行并到當前行末尾# 并去掉原來行尾的反斜杠sed -e :a -e '/\\$/N; s/\\\n//; ta'# 如果當前行以等號開頭,將當前行并到上一行末尾# 并以單個空格代替原來行頭的“=”sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'# 為數字字串增加逗號分隔符號,將“1234567”改為“1,234,567”gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sedsed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed# 為帶有小數點和負號的數值增加逗號分隔符(GNU sed)gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)gsed '0~5G' # 只對GNU sed有效sed 'n;n;n;n;G;' # 其他sed選擇性地顯示特定行
q命令
退出循環(huán)
選擇性地刪除特定行
--------# 顯示通篇文檔,除了兩個正則表達式之間的內容sed '/Iowa/,/Montana/d'# 刪除文件中相鄰的重復行(模擬“uniq”)# 只保留重復行中的第一行,其他行刪除sed '$!N; /^\(.*\)\n\1$/!P; D'# 刪除文件中的重復行,不管有無相鄰。注意hold space所能支持的緩存# 大小,或者使用GNU sed。sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'# 刪除除重復行外的所有行(模擬“uniq -d”)sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'# 刪除文件中開頭的10行sed '1,10d'# 刪除文件中的最后一行sed '$d'# 刪除文件中的最后兩行sed 'N;$!P;$!D;$d'# 刪除文件中的最后10行sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2# 刪除8的倍數行gsed '0~8d' # 只對GNU sed有效sed 'n;n;n;n;n;n;n;d;' # 其他sed# 刪除匹配式樣的行sed '/pattern/d' # 刪除含pattern的行。當然pattern# 可以換成任何有效的正則表達式# 刪除文件中的所有空行(與“grep '.' ”效果相同)sed '/^$/d' # 方法1sed '/./!d' # 方法2# 只保留多個相鄰空行的第一行。并且刪除文件頂部和尾部的空行。# (模擬“cat -s”)sed '/./,/^$/!d' #方法1,刪除文件頂部的空行,允許尾部保留一空行sed '/^$/N;/\n$/D' #方法2,允許頂部保留一空行,尾部不留空行# 只保留多個相鄰空行的前兩行。sed '/^$/N;/\n$/N;//D'# 刪除文件頂部的所有空行sed '/./,$!d'# 刪除文件尾部的所有空行sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # 對所有sed有效sed -e :a -e '/^\n*$/N;/\n$/ba' # 同上,但只對 gsed 3.02.*有效# 刪除每個段落的最后一行sed -n '/^$/{p;h;};/./{x;/./p;}'特殊應用
--------# 移除手冊頁(man page)中的nroff標記。在Unix System V或bash shell下使# 用'echo'命令時可能需要加上 -e 選項。sed "s/.`echo \\\b`//g" # 外層的雙括號是必須的(Unix環(huán)境)sed 's/.^H//g' # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-Hsed 's/.\x08//g' # sed 1.5,GNU sed,ssed所使用的十六進制的表示方法# 提取新聞組或 e-mail 的郵件頭sed '/^$/q' # 刪除第一行空行后的所有內容# 提取新聞組或 e-mail 的正文部分sed '1,/^$/d' # 刪除第一行空行之前的所有內容# 從郵件頭提取“Subject”(標題欄字段),并移除開頭的“Subject:”字樣sed '/^Subject: */!d; s///;q'# 從郵件頭獲得回復地址sed '/^Reply-To:/q; /^From:/h; /./d;g;q'# 獲取郵件地址。在上一個腳本所產生的那一行郵件頭的基礎上進一步的將非電郵# 地址的部分剃除。(見上一腳本)sed 's/ *(.*)//; s/>.*//; s/.*[:# 在每一行開頭加上一個尖括號和空格(引用信息)sed 's/^/> /'# 將每一行開頭處的尖括號和空格刪除(解除引用)sed 's/^> //'# 移除大部分的HTML標簽(包括跨行標簽)sed -e :a -e 's/]*>//g;/# 將分成多卷的uuencode文件解碼。移除文件頭信息,只保留uuencode編碼部分。# 文件必須以特定順序傳給sed。下面第一種版本的腳本可以直接在命令行下輸入;# 第二種版本則可以放入一個帶執(zhí)行權限的shell腳本中。(由Rahul Dhesi的一# 個腳本修改而來。)sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2# 將文件中的段落以字母順序排序。段落間以(一行或多行)空行分隔。GNU sed使用# 字元“\v”來表示垂直制表符,這里用它來作為換行符的占位符——當然你也可以# 用其他未在文件中使用的字符來代替它。sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'# 分別壓縮每個.TXT文件,壓縮后刪除原來的文件并將壓縮后的.ZIP文件# 命名為與原來相同的名字(只是擴展名不同)。(DOS環(huán)境:“dir /b”# 顯示不帶路徑的文件名)。echo @echo off >zipup.batdir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat使用SED:Sed接受一個或多個編輯命令,并且每讀入一行后就依次應用這些命令。當讀入第一行輸入后,sed對其應用所有的命令,然后將結果輸出。接著再讀入第二行輸入,對其應用所有的命令……并重復這個過程。上一個例子中sed由標準輸入設備(即命令解釋器,通常是以管道輸入的形式)獲得輸入。在命令行給出一個或多個文件名作為參數時,這些文件取代標準輸入設備成為sed的輸入。sed的輸出將被送到標準輸出(顯示器)。因此:cat filename | sed '10q' # 使用管道輸入sed '10q' filename # 同樣效果,但不使用管道輸入sed '10q' filename > newfile # 將輸出轉移(重定向)到磁盤上 要了解sed命令的使用說明,包括如何通過腳本文件(而非從命令行)來使用這些命 令,請參閱《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins (O'Reilly,1997;http://www.ora.com),《UNIX Text Processing》,作者 Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst寫的教程——壓縮包的名稱是“U-SEDIT2.ZIP”(在許多站點上都找得到)。要發(fā)掘sed的潛力,則必須對“正則表達式”有足夠的理解。正則表達式的資料可以看《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)。 Unix系統(tǒng)所提供的手冊頁(“man”)也會有所幫助(試一下這些命令 “man sed”、“man regexp”,或者看“man ed”中關于正則表達式的部分),但手冊提供的信息比較“抽象”——這也是它一直為人所詬病的。不過,它本來就不 是用來教初學者如何使用sed或正則表達式的教材,而只是為那些熟悉這些工具的人提供的一些文本參考。 括號語法:前面的例子對sed命令基本上都使用單引號('...')而非雙引號("...")這是因為sed通常是在Unix平臺上使用。單引號下,Unix的shell(命令解釋器)不會對美元符($)和后引號(`...`)進行解釋和執(zhí)行。而在雙引號下美元符會被展開為變量或參數的值,后引號中的命令被執(zhí)行并以輸出的結果代替后引號中的內容。而在“csh”及其衍生的shell中使用感嘆號(!)時需要在其前面加上轉義用的反斜杠(就像這樣:\!)以保證上面所使用的例子能正常運行(包括使用單引號的情況下)。DOS版本的Sed則一律使用雙引號("...")而不是引號來圈起命令。 '\t'的用法:為了使本文保持行文簡潔,我們在腳本中使用'\t'來表示一個制表符。但是現在大部分版本的sed還不能識別'\t'的簡寫方式,因此當在命令行中為腳本輸入制表符時,你應該直接按TAB鍵來輸入制表符而不是輸入'\t'。下列的工具軟件都支持'\t'做為一個正則表達式的字元來表示制表符:awk、perl、HHsed、sedmod以及GNU sed v3.02.80。 不同版本的SED:不同的版本間的sed會有些不同之處,可以想象它們之間在語法上會有差異。具體而言,它們中大部分不支持在編輯命令中間使用標簽(:name)或分支命令(b,t),除非是放在那些的末尾。這篇文檔中我們盡量選用了可移植性較高的語法,以使大多數版本的sed的用戶都能使用這些腳本。不過GNU版本的sed允許使 用更簡潔的語法。想像一下當讀者看到一個很長的命令時的心情:sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d 好消息是GNU sed能讓命令更緊湊:sed '/AAA/b;/BBB/b;/CCC/b;d' # 甚至可以寫成sed '/AAA|BBB|CCC/b;d' 此外,請注意雖然許多版本的sed接受象“/one/ s/RE1/RE2/”這種在's'前帶有空格的命令,但這些版本中有些卻不接受這樣的命令:“/one/! s/RE1/RE2/”。這時只需要把中間的空格去掉就行了。 速度優(yōu)化:當由于某種原因(比如輸入文件較大、處理器或硬盤較慢等)需要提高 命令執(zhí)行速度時,可以考慮在替換命令(“s/.../.../”)前面加上地址表達式來 提高速度。舉例來說:sed 's/foo/bar/g' filename # 標準替換命令sed '/foo/ s/foo/bar/g' filename # 速度更快sed '/foo/ s//bar/g' filename # 簡寫形式 當只需要顯示文件的前面的部分或需要刪除后面的內容時,可以在腳本中使用“q” 命令(退出命令)。在處理大的文件時,這會節(jié)省大量時間。因此:sed -n '45,50p' filename # 顯示第45到50行sed -n '51q;45,50p' filename # 一樣,但快得多 如果你有其他的單行腳本想與大家分享或者你發(fā)現了本文檔中錯誤的地方,請發(fā)電 子郵件給本文檔的作者(Eric Pement)。郵件中請記得提供你所使用的sed版本、 該sed所運行的操作系統(tǒng)及對問題的適當描述。本文所指的單行腳本指命令行的長 度在65個字符或65個以下的sed腳本〔譯注1〕。本文檔的各種腳本是由以下所列作 者所寫或提供:Al Aab # 建立了“seders”郵件列表Edgar Allen # 許多方面Yiorgos Adamopoulos # 許多方面Dale Dougherty # 《sed & awk》作者Carlos Duarte # 《do it with sed》作者Eric Pement # 本文檔的作者Ken Pizzini # GNU sed v3.02 的作者S.G. Ravenhall # 去html標簽腳本Greg Ubben # 有諸多貢獻并提供了許多幫助 ------------------------------------------------------------------------- 譯注1:大部分情況下,sed腳本無論多長都能寫成單行的形式(通過`-e'選項和`;' 號)——只要命令解釋器支持,所以這里說的單行腳本除了能寫成一行還對長度有 所限制。因為這些單行腳本的意義不在于它們是以單行的形式出現。而是讓用戶能 方便地在命令行中使用這些緊湊的腳本才是其意義所在。BSD版本Sed的文檔
BSDGeneralCommandsManual
NAME
sed – stream editor
SYNOPSIS【簡略】
sed [-Ealn] command [file …]
【即為】sed [option] command [file…]
sed [-Ealn] [-e command] [-f command_file] [-i extension] [file …]
DESCRIPTION【描述】
The sed utility reads the specified files【指定的文件】, or the standard input if no
files are specified, modifying the input as specified by a list of com-
mands. The input is then written to the standard output.
A single command may be specified as the first argument to sed. Multiple
commands may be specified by using the -e or -f options. All commands
are applied to the input in the order they are specified regardless of
their origin.
【可選的option】The following options are available:
-E【使用擴展正則表達式】 Interpret regular expressions as extended (modern) regularexpressions rather than basic regular expressions (BRE's). There_format(7) manual page fully describes both formats.-a The files listed as parameters for the ``w'' functions are cre-ated (or truncated) before any processing begins, by default.The -a option causes sed to delay opening each file until a com-mand containing the related ``w'' function is applied to a lineof input.-e command【使用多個command】Append the editing commands specified by the command argument tothe list of commands.-f command_file【指令文件】Append the editing commands found in the file command_file to thelist of commands. The editing commands should each be listed ona separate line.-i extensionEdit files in-place, saving backups with the specified extension.If a zero-length extension is given, no backup will be saved. Itis not recommended to give a zero-length extension when in-placeediting files, as you risk corruption or partial content in situ-ations where disk space is exhausted, etc.-l Make output line buffered.-n By default, each line of input is echoed to the standard outputafter all of the commands have been applied to it. The -n optionsuppresses(壓制,阻礙) this behavior.【command中所可選的限定符】
The form of a sed command is as follows:
[address[,address]]function[arguments]
Sed Addresses
An address is not required, but if specified must be a number (that
counts input lines cumulatively across input files), a dollar (“$”)
character that addresses the last line of input, or a context address
(which consists of a regular expression preceded and followed by a delimiter).
【sed中的正則表達式】
Sed Regular Expressions
The regular expressions used in sed, by default, are basic regular
expressions (BREs, see re_format(7) for more information), but extended
(modern) regular expressions can be used instead if the -E flag is given.
In addition, sed has the following two additions to regular expressions:
Sed Functions
In the following list of commands, the maximum number of permissible【允許的】 addresses for each command is indicated【指示】 by [0addr], [1addr], or [2addr],representing zero, one, or two addresses.
ENVIRONMENT
The COLUMNS, LANG, LC_ALL, LC_CTYPE and LC_COLLATE environment variables
affect the execution of sed as described in environ(7).
EXIT STATUS
The sed utility exits 0 on success, and >0 if an error occurs.
LEGACY DESCRIPTION
Warnings are not generated for unused labels. In legacy mode, they are.
In the -y function, doubled backslashes are not converted to single ones.
In legacy mode, they are.
For more information about legacy mode, see compat(5).
SEE ALSO
awk(1), ed(1), grep(1), regex(3), compat(5), re_format(7)
STANDARDS
The sed utility is expected to be a superset of the IEEE Std 1003.2
(“POSIX.2”) specification.
The -E, -a and -i options are non-standard FreeBSD extensions and may not
be available on other operating systems.
HISTORY
A sed command, written by L. E. McMahon, appeared in Version 7 AT&T UNIX.
AUTHORS
Diomidis D. Spinellis dds@FreeBSD.org
BUGS
Multibyte characters containing a byte with value 0x5C (ASCII `\’) may be
incorrectly treated as line continuation characters in arguments to the
a'',c” and i'' commands. Multibyte characters cannot be used as
delimiters with thes” and “y” commands.
BSD May 10, 2005 BSD
版權聲明:本文為博主原創(chuàng)文章,轉載請標明出處。
轉載于:https://www.cnblogs.com/fridge/p/4861888.html
總結
以上是生活随笔為你收集整理的Linux学习笔记Sed最全整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery的$(document).r
- 下一篇: loadrunner 参数化