該文件記錄GNU 版本4.4 sed,一個流編輯器。
創(chuàng)新互聯(lián)服務項目包括龍里網站建設、龍里網站制作、龍里網頁制作以及龍里網絡營銷策劃等。多年來,我們專注于互聯(lián)網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網行業(yè)的解決方案,龍里網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到龍里省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
版權所有©1998-2017自由軟件基金會
授權根據(jù)GNU自由文件許可證1.3版或自由軟件基金會發(fā)布的任何更新版本的條款復制,分發(fā)和/或修改本文檔; 沒有不變的部分,沒有封面文本,也沒有封底文本。許可證的副本包含在題為“GNU自由文件許可證”的部分。
? 介紹: | 介紹 | |
? 調用sed: | 調用 | |
? sed腳本: | sed 腳本 | |
? sed地址: | 地址:選擇行 | |
? sed正則表達式: | 正則表達式:選擇文本 | |
? 高級sed: | 高級sed:循環(huán)和緩沖區(qū) | |
? 示例: | 一些示例腳本 | |
? 限制: | GNU的限制和(非)限制 sed | |
? 其他資源: | 其他資源用于學習 sed | |
? 報告錯誤: | 報告錯誤 | |
? GNU免費文檔許可證: | 復制并分享本手冊 | |
? 概念指標: | 本手冊中包含所有主題的菜單。 | |
? 命令和選項索引: | 具有所有sed命令和命令行選項的菜單。 |
sed是一個流編輯器。流編輯器用于對輸入流(文件或流水線的輸入)執(zhí)行基本文本轉換。雖然在某些方面類似于允許腳本編輯(例如ed) 的編輯器,sed只能通過輸入一次,但效率更高。但是,它有sed能力在管道中過濾文本,特別區(qū)別于其他類型的編輯器。
本章介紹如何運行sed。sed 腳本和單個sed命令的詳細信息將在下一章討論。
? 概述: | ||
? 命令行選項: | ||
? 退出狀態(tài): |
通常sed被這樣調用:
sed SCRIPT INPUTFILE ...
例如,要取代所有出現(xiàn)的“你好' 至 '世界'在文件中 input.txt中:
sed / s / hello / world /'input.txt> output.txt
如果不指定INPUTFILE,或者如果INPUTFILE是 - , sed過濾標準輸入的內容。以下命令是等效的:
sed / s / hello / world /'input.txt> output.txt sed's / hello / world /' output.txt cat input.txt |sed / s / hello / world /' - > output.txt
sed將輸出寫入標準輸出。使用-一世在現(xiàn)場編輯文件而不是打印到標準輸出。又見W和s///w寫入輸出到其它文件的命令。以下命令修改file.txt的 并且不產生任何輸出:
sed -i / hello / world'file.txt
默認情況下sed打印所有已處理的輸入(除了通過命令修改/刪除的輸入d)。使用-n抑制輸出,以及p打印特定行的命令。以下命令僅打印輸入文件的第45行:
sed -n'45p'file.txt
sed將多個輸入文件視為一個長流。以下示例打印第一個文件的第一行(此時就把one.txt存盤)和最后一個文件的最后一行(three.txt)。使用-s 以扭轉這種行為。
sed -n'1p;$ p'one.txt two.txt three.txt
沒有 -e 要么 -F選項,sed使用第一個非選項參數(shù)作為腳本,以及以下非選項參數(shù)作為輸入文件。如果-e 要么 -F選項用于指定腳本,所有非選項參數(shù)均作為輸入文件。選項-e和 -F可以組合,并且可以出現(xiàn)多次(在這種情況下,最終的有效腳本將連接所有單個腳本)。
以下示例是等效的:
sed'/ hello / world /'input.txt> output.txt sed -e's / hello / world /'input.txt> output.txtsed --expression ='s / hello / world /'input.txt > output.txt echo's / hello / world /'> myscript.sed sed -f myscript.sed input.txt> output.txt sed --file = myscript.sed input.txt> output.txt
調用的完整格式sed是:
sed選項... [SCRIPT] [INPUTFILE ...]
sed 可以使用以下命令行選項調用:
--version打印sed正在運行的版本和版權聲明,然后退出。
--help打印使用消息,簡要總結這些命令行選項和錯誤報告地址,然后退出。
-n --quiet --silent默認情況下,sed通過腳本在每個循環(huán)結束時打印出圖案空間(請參閱如何sed工作)。這些選項禁用此自動打印,并且sed僅在通過p命令明確告知時才產生輸出。
-e script --expression=script將腳本中的命令添加到要處理輸入時要運行的命令集。
-f script-file --file=script-file將文件腳本文件中包含的命令添加 到要處理輸入時要運行的命令集。
-i[SUFFIX] --in-place[=SUFFIX]此選項指定要在現(xiàn)場編輯文件。 GNU sed通過創(chuàng)建臨時文件并將輸出發(fā)送到此文件而不是標準輸出。1。
這個選項意味著 -s。
當文件結束到達時,臨時文件將重命名為輸出文件的原始名稱。擴展名(如果提供)用于在重命名臨時文件之前修改舊文件的名稱,從而備份副本2)。
該規(guī)則遵循:如果擴展名不包含a *,則作為后綴添加到當前文件名的末尾; 如果擴展名包含一個或多個* 字符,則每個星號將替換為當前文件名。這允許您為備份文件添加前綴,而不是(或除了)后綴,甚至將原始文件的備份副本放置到另一個目錄中(如果目錄已存在)。
如果沒有提供擴展名,原始文件將被覆蓋而不進行備份。
-l N --line-length=N指定命令的默認換行長度l。長度為零(零)意味著永遠不要纏繞長線。如果未指定,則取為70。
--posixGNU sed包括POSIX sed的幾個擴展名。為了簡化寫入便攜式腳本,此選項將禁用此手冊所有文檔的擴展名,包括其他命令。 大多數(shù)擴展sed程序都接受POSIX所規(guī)定的語法之外的程序,但其中一些(例如Reporting Bugs中N描述的命令的行為)實際上違反了標準。如果要僅禁用后一種擴展名,則可以將該變量設置為非空值。 POSIXLY_CORRECT
-b --binary此選項在每個平臺上可用,但僅在操作系統(tǒng)區(qū)分文本文件和二進制文件之間才有效。當進行這樣的區(qū)分時,如MS-DOS,Windows的情況,Cygwin文本文件由由回車符和換行字符分隔的行組成 ,并且sed看不到結尾的CR。當指定此選項時,sed將以二進制模式打開輸入文件,因此不要求此特殊處理,并考慮以行結尾的行。
--follow-symlinks此選項僅在支持符號鏈接的平臺上可用,并且僅在選項時才有效果 -一世 被指定。在這種情況下,如果在命令行中指定的文件是符號鏈接,sed則將跟隨鏈接并編輯鏈接的最終目的地。默認行為是中斷符號鏈接,以使鏈接目的地不被修改。
-E -r --regexp-extended使用擴展正則表達式而不是基本正則表達式。擴展的正則表達式是那些 egrep接受的; 它們可以更清晰,因為它們通常具有較少的反斜杠。歷史上這是一個GNU擴展,但是-E 擴展已經被添加到POSIX標準(http://austingroupbugs.net/view.php?id=528),所以使用 -E為了便攜性。GNU sed已經接受了-E 作為多年來的無證選項,* BSD seds已經接受 -E 多年以來,但使用的腳本 -E可能不會移植到其他舊系統(tǒng)。見擴展正則表達式。
-s --separate默認情況下,sed會將命令行上指定的文件視為單個連續(xù)的長流。該GNU sed 擴展允許用戶將它們視為單獨的文件:范圍地址(如“/ ABC /,/ DEF /')不允許跨越多個文件,行號相對于每個文件的開始,$指的是每個文件的最后一行,并且從R命令調用的文件在每個文件的開頭都被重繞。
--sandbox在沙箱模式下, e/w/r命令被拒絕 - 包含它們的程序將被中止而不運行。沙箱模式確保sed 僅在命令行上指定的輸入文件上運行,并且無法運行外部程序。
-u --unbuffered緩沖輸入和輸出盡可能最低限度。(如果輸入來自“尾巴',您希望盡快看到轉換后的輸出。)
-z --null-data --zero-terminated將輸入視為一組行,每行以零字節(jié)(ASCII'NUL'字符)而不是換行符。此選項可用于命令,如'-z'和'find -print0'來處理任意的文件名。
如果不 -e, -F, - 表達, 要么 - 文件 選項在命令行中給出,則命令行上的第一個非選項參數(shù)被視為要執(zhí)行的腳本。
如果在處理上述內容后仍有任何命令行參數(shù),這些參數(shù)將被解釋為要處理的輸入文件的名稱。 文件名“ - '指標準輸入流。如果沒有指定文件名,將處理標準輸入。
退出狀態(tài)為零表示成功,非零值表示失敗。GNU sed返回以下退出狀態(tài)錯誤值:
0成功完成
1無效的命令,無效的語法,無效的正則表達式或與之一起使用的 GNU sed擴展命令--posix。
2在命令行上指定的一個或多個輸入文件無法打開(例如,如果找不到文件或拒絕讀取權限)。處理繼續(xù)與其他文件。
4I / O錯誤或運行時嚴重的處理錯誤, GNU sed立即中止。
另外,該命令q和Q可用于終止 sed與自定義退出代碼值(這是一個GNU sed擴展名):
$ echo |sed'Q42';echo $? 42
? sed腳本概述: | sed 腳本概述 | |
? sed命令列表: | sed 命令摘要 | |
? “s”命令: | sed的瑞士軍刀 | |
? 常用命令: | 經常使用的命令 | |
? 其他命令: | 不常用的命令 | |
? 編程命令: | sed大師 命令 | |
? 擴展命令: | 特定于GNU的命令 sed | |
? 多種命令語法: | 擴展更容易腳本 |
甲sed程序由一個或多個的sed命令,由一個或多個的傳遞 -e, -F, - 表達,和 - 文件 選項或第一個非選項參數(shù),如果使用這些選項的零。本文將參考“the” sed腳本; 這被理解為意味著傳入的所有腳本和腳本文件的順序連接。請參閱概述。
sed 命令遵循以下語法:
[addr]X [選項]
X是單字母sed命令。 [addr]是可選的行地址。如果[addr]指定,則命令X將僅在匹配的行上執(zhí)行。 [addr]可以是單行號,正則表達式或行范圍(請參見sed地址)。額外[options]的用于某些sed命令。
以下示例刪除輸入中的行30到35。 30,35是地址范圍。d是delete命令:
sed '30,35d'input.txt> output.txt
以下示例打印所有輸入,直到以“FOO'被發(fā)現(xiàn)。如果找到這樣的行, sed將以退出狀態(tài)42終止。如果沒有找到這樣的行(并且沒有其他錯誤發(fā)生),sed 將退出狀態(tài)0. /^foo/是一個正則表達式地址。 q是退出命令。42是命令選項。
sed'/ ^ foo / q42'input.txt> output.txt
一個內的命令腳本或腳本文件可以由分號(分離;)或換行符(ASCII 10)??梢灾付ǘ鄠€腳本-e 要么 -F 選項。
以下示例都是等效的。他們執(zhí)行兩個sed 操作:刪除與正則表達式匹配的任何行/^foo/,并替換字符串的所有出現(xiàn)“你好'與'世界“:
sed'/ ^ foo / d;s / hello / world /'input.txt> output.txt sed -e'/ ^ foo / d'-e's / hello / world /'input.txt> output.txt echo'/ ^ foo / d'> script.sed echo's / hello / world /'>> script.sed sed -f script.sed input.txt> output.txt echo'/ hello / world /'> script2.sed sed -e'/ ^ foo / d'-f script2.sed input.txt> output.txt
命令a,c,i,由于它們的語法,不能被隨后工作作為命令分隔符分號,因此應當用換行被終止或者被放置在的末端腳本或腳本文件。命令之前也可以帶有可選的非空白字符。請參閱多命令語法。
GNU 支持以下命令sed。一些是標準的POSIX命令,而另外一些是GNU擴展。每個命令的詳細信息和示例如下。(助記符)顯示在括號中。
a\ text在一行后附加文本。
a text在一行之后附加文本(替代語法)。
b label無條件分配標簽。該標簽可以被省略,在這種情況下,在下一個周期開始。
c\ text用文本替換(更改)行。
c text用文本替換(更改)行(替代語法)。
d刪除圖案空間; 馬上開始下一個循環(huán)。
D如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,并重新啟動循環(huán)與結果模式空間,而不會讀取新的輸入行。
如果模式空間不包含換行符,則會像d執(zhí)行命令一樣啟動正常的新循環(huán)。
e執(zhí)行在模式空間中找到的命令,并使用輸出替換模式空間; 尾隨的換行被壓制。
e command執(zhí)行命令并將其輸出發(fā)送到輸出流。該命令可以跨多行運行,除了最后一行之外,還有一個反斜杠。
F(filename)打印當前輸入文件的文件名(帶尾隨的換行符)。
g使用保持空間的內容替換圖案空間的內容。
G在圖案空間的內容中附加換行符,然后將保留空間的內容附加到模式空間的內容。
h(保持)用圖案空間的內容替換保持空間的內容。
H在保留空間的內容中附加換行符,然后將模式空間的內容附加到保留空間的內容。
i\ text在一行之前插入文字。
i text在一行之前插入文本(替代語法)。
l以明確的形式打印圖案空間。
n(接下來)如果自動打印未被禁用,請打印圖案空間,然后,無論如何將圖案空間替換為下一行輸入。如果沒有更多的輸入,則sed退出而不處理任何命令。
N向模式空間添加換行符,然后將下一行輸入追加到模式空間。如果沒有更多的輸入,則sed退出而不處理任何命令。
p打印圖案空間。
P打印圖案空間,直到第一個。
q[exit-code](退出)退出sed而不處理任何命令或輸入。
Q[exit-code](退出)此命令q與圖形空間的內容相同,但不會打印。像q它一樣,它提供了返回一個退出代碼給調用者的功能。
r filename讀取文本文件一個文件。例:
R filename在當前周期結束時或當讀取下一個輸入行時,將一行文件名排隊讀取并插入到輸出流中。
s/regexp/replacement/[flags](替換)將正則表達式與模式空間的內容進行匹配。如果找到了,更換匹配的字符串 替換。
t label(測試)分支到標簽,只有當s自上一條輸入行被讀取或條件分支以來已成功 執(zhí)行時,才能進行標記。該標簽可以被省略,在這種情況下,在下一個周期開始。
T label(測試)只有當自上次輸入行被讀取或條件分支以來沒有成功的 ubstitut 分支,才能進行標簽s。該標簽可以被省略,在這種情況下,在下一個周期開始。
v [version](版本)此命令不執(zhí)行任何操作,但sed如果 不支持GNU sed擴展,或者所請求的版本不可用,則會失敗。
w filename將模式空間寫入文件名。
W filename將給定的文件名寫入到第一個換行符的模式空間的部分
x交換保留和模式空格的內容。
y/src/dst/將與任何源字符匹配的模式空間中的任何字符與dest-chars中的相應字符進行音譯。
z(zap)此命令清空模式空間的內容。
#一個評論,直到下一個換行符。
{ cmd ; cmd ... }組合幾個命令。
=打印當前輸入行號(帶有尾隨的換行符)。
: label指定的位置的標簽為分支命令(b, t,T)。
該s命令(如替代)可能是最重要的sed,有很多不同的選擇。該s命令的語法是's / regexp / replacement / flags”。
它的基本概念很簡單:該s命令嘗試將模式空間與提供的正則表達式regexp匹配; 如果匹配成功,則匹配的模式空間的那部分被替換替換。
有關regexp語法的詳細信息,請參閱正則表達式地址。
所述替換可以包含(?是一個從1到9,包括端點)的引用,這指的是包含在之間的匹配的所述部分?個 及其匹配。此外,替換可以包含 引用模式空間的整個匹配部分的未轉義字符。 \n\(\)&
該/ 字符可通過任何給定的內的任何其他單個字符被均勻地取代s命令。的/ 字符(或任何其他字符代替它使用)可以在出現(xiàn)正則表達式或替換 僅當它是由前面\的字符。
最后,作為一個GNU sed擴展,可以包括由一個反斜杠和一個字母的特殊序列 L,l,U,u,或E。其含義如下:
\L將替換為小寫,直到找到\U或\E找到,
\l將下一個字符轉成小寫,
\U將替換成大寫,直到找到\L或\E找到,
\u將下一個字符轉成大寫字母,
\E停止案件轉換由\L或開始\U。
當g標志被使用時,情況轉換不會從正常表達式的一個出現(xiàn)傳播到另一個。例如,當執(zhí)行以下命令時,AB-'在圖案空間:
S / \(B \ \?) - / X \ U \ 1 /克
輸出為'axxB”。當更換第一個' - ','\ü'序列只影響'\ 1”。它不影響x更換時被添加到模式空間字符b-用xB。
在另一方面,\l并且\u做影響了替換文本的其余部分,如果他們之后是一個空的替代。隨著'AB-'在模式空間中,以下命令:
S / \(B \ \?) - / \ U \ 1X /克
將取代“ - '與'X'(大寫)和'B-'與'BX”。如果這種行為是不希望的,你可以通過添加一個“。\ E'序后'\ 1' 在這種情況下。
要包括文字\,&或在最終替換換行符,一定要早于期望的\,&或換行的置換用\。
該s命令可以后跟零個或多個以下標志:
g將替換應用于所有匹配到正則表達式,而不僅僅是第一個。
number只有更換數(shù)屆的匹配正則表達式。
s指揮 相互作用注意:POSIX標準沒有指定當您混合g和數(shù)字修飾符時應該發(fā)生什么,并且目前在sed實現(xiàn)中沒有廣泛同意的含義。對于GNU sed,交互定義為:在數(shù)字 th 之前忽略匹配,然后匹配并替換所有匹配的數(shù)字。
p如果進行替換,則打印新的圖案空間。
注意:當指定了選項p和e選項時,兩者的相對排序產生非常不同的結果。一般來說,ep(評估然后打?。┦悄阆胍?,但另一方面操作可能對調試是有用的。因此,當前版本的GNU sed特別解釋p了前后選項的存在,e在評估之前和之后 打印模式空間,而一般來說,該s命令的標志只顯示一次。盡管如此,這種行為可能會在將來的版本中發(fā)生變化。
w filename如果進行替換,則將結果寫入命名文件。作為GNU sed擴展,支持兩個特殊的文件名值:的/ dev /標準錯誤,將結果寫入標準錯誤,以及 的/ dev /標準輸出,寫入標準輸出。3
e該命令允許從shell命令將輸入管道轉換為模式空間。如果進行替換,則執(zhí)行在模式空間中找到的命令,并將其空格替換為其輸出。尾隨的換行被壓制; 如果要執(zhí)行的命令包含NUL字符,則結果未定義。這是一個GNU sed擴展。
I iI正則表達式匹配的修飾符是一個GNU 擴展,它使sed匹配正則表達式以不區(qū)分大小寫的方式。
M mM正則表達式匹配的修飾符是GNU sed 擴展,它指示GNU sed在多行模式下匹配正則表達式。修飾符分別引起^和$匹配換行符之后的空字符串(除正常行為之外),換行符之前的空字符串。有一些特殊的字符序列(\`和\')始終與緩沖區(qū)的開頭或結尾相匹配。另外,在多行模式下,句點字符與新行字符不匹配。
如果你完全使用sed,你很可能想知道這些命令。
#
該#字符開頭的注釋; 評論將持續(xù)到下一個換行符。
如果您關心可移植性,請注意,某些實現(xiàn)sed(其不 符合POSIX的)可能僅支持單個單行注釋,然后僅在腳本的第一個字符為a時才支持#。
警告:如果sed腳本的前兩個字符是#n,那么-n(no-autoprint)選項被強制。如果您想在腳本的第一行發(fā)表評論,該評論以字母“?“你不想要這個行為,那么一定要用一個資本”?'或者在'?”。
q [exit-code]退出sed而不處理任何命令或輸入。
示例:打印第二行后停止:
$ seq 3 |sed 2q 1 2
此命令只接受一個地址。請注意,如果沒有禁用自動打印,則打印當前圖案空間-n選項。從sed腳本返回退出代碼的功能是GNU sed擴展。
另請參見GNU sed擴展Q命令,無需打印當前模式空間即可靜默退出。
d刪除圖案空間; 馬上開始下一個循環(huán)。
示例:刪除第二個輸入行:
$ seq 3 |sed 2d 1 3
打印圖案空間(到標準輸出)。此命令通常僅與該命令配合使用-n 命令行選項。
示例:僅打印第二個輸入行:
$ seq 3 |sed -n 2p 2
如果未禁用自動打印,請打印圖案空間,然后,無論如何使用下一行輸入替換圖案空間。如果沒有更多的輸入,則sed退出而不處理任何命令。
該命令對于跳過線是有用的(例如,每第N行處理)。
示例:在每3行執(zhí)行替換(即兩個n命令跳過兩行):
$ seq 6 |sed'n; n; s /./ x /' 1 2 x 4 5 x
GNU sed提供的擴展地址語法第一?步驟 ,以實現(xiàn)相同的結果:
$ seq 6 |sed'0?3s /./ x /' 1 2 x 4 5 x
一組命令可之間被封閉 {和}字符。當您希望通過單個地址(或地址范圍)匹配來觸發(fā)一組命令時,這特別有用。
示例:執(zhí)行替換然后打印第二個輸入行:
$ seq 3 |sed -n'2 {s / 2 / X /;p}' X
雖然可能比上一節(jié)更少使用,但是sed可以使用這些命令構建一些非常小的但有用的腳本。
y/source-chars/dest-chars/將與任何源字符匹配的模式空間中的任何字符與dest-chars中的相應字符進行音譯。
示例:音譯'AJ'進'0-9“:
$ echo你好世界| sed'y/ abcdefghij / 0123456789 /'74llo worl3
(/任何給定y命令中的字符可以被任何其他單個字符均勻地替換。)
所述的實例/(或者任何其他字符代替它使用), \或換行符可以出現(xiàn)在源極-字符或DEST-字符 列表,提供每個實例由逃脫\。的源極-字符和DEST-字符列表必須 包含相同數(shù)量的字符(后脫逸出)。
有關tr類似的功能,請參閱GNU coreutils中的命令。
a text