導航:首頁 > 程序命令 > 命令行sed是什麼意思

命令行sed是什麼意思

發布時間:2022-08-07 18:12:58

A. SED的簡介

Sed腳本是一個sed的命令清單,啟動Sed時以-f選項引導腳本文件名。Sed對於腳本中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多個命令,要用分號分隔。以#開頭的行為注釋行,且不能跨行。

B. linux命令 sed 請問有哪位大大知道這個sed 命令是什麼意思嗎 sed 's/\//\\\//g'

sed 編輯器是 Linux 系統管理員的工具包中最有用的資產之一,
因此,有必要徹底地了解其應用

Linux 操作系統最大的一個好處是它帶有各種各樣的實用工具。存在如此之多不同的實用工具,幾乎不可能知道並了解所有這些工具。可以簡化關鍵情況下操作的一個實用 工具是 sed。它是任何管理員的工具包中最強大的工具之一,並且可以證明它自己在關鍵情況下非常有價值。

sed 實用工具是一個「編輯器」,但它與其它大多數編輯器不同。除了不面向屏幕之外,它還是非互動式的。這意味著您必須將要對數據執行的命令插入到命令行或要處 理的腳本中。當顯示它時,請忘記您在使用 Microsoft Word 或其它大多數編輯器時擁有的互動式編輯文件功能。sed 在一個文件(或文件集)中非互動式、並且不加詢問地接收一系列的命令並執行它們。因而,它流經文本就如同水流經溪流一樣,因而 sed 恰當地代表了流編輯器。它可以用來將所有出現的 "Mr. Smyth" 修改為 "Mr. Smith",或將 "tiger cub" 修改為 "wolf cub"。流編輯器非常適合於執行重復的編輯,這種重復編輯如果由人工完成將花費大量的時間。其參數可能和一次性使用一個簡單的操作所需的參數一樣有限, 或者和一個具有成千上萬行要進行編輯修改的腳本文件一樣復雜。sed 是 Linux 和 UNIX 工具箱中最有用的工具之一,且使用的參數非常少。

sed 的工作方式

sed 實用工具按順序逐行將文件讀入到內存中。然後,它執行為該行指定的所有操作,並在完成請求的修改之後將該行放回到內存中,以將其轉儲至終端。完成了這一行 上的所有操作之後,它讀取文件的下一行,然後重復該過程直到它完成該文件。如同前面所提到的,默認輸出是將每一行的內容輸出到屏幕上。在這里,開始涉及到 兩個重要的因素—首先,輸出可以被重定向到另一文件中,以保存變化;第二,源文件(默認地)保持不被修改。sed 默認讀取整個文件並對其中的每一行進行修改。不過,可以按需要將操作限制在指定的行上。

該實用工具的語法為:

sed [options] '{command}' [filename]

在這篇文章中,我們將瀏覽最常用的命令和選項,並演示它們如何工作,以及它們適於在何處使用。

替換命令

sed 實用工具以及其它任何類似的編輯器的最常用的命令之一是用一個值替換另一個值。用來實現這一目的的操作的命令部分語法是:

's/{old value}/{new value}/'

因而,下面演示了如何非常簡單地將 "tiger" 修改為 "wolf":

$ echo The tiger cubs will meet on Tuesday after school | sed
's/tiger/wolf/'
The wolf cubs will meet on Tuesday after school
$

注意如果輸入是源自之前的命令輸出,則不需要指定文件名—同樣的原則也適用於 awk、sort 和其它大多數 LinuxUNIX 命令行實用工具程序。

多次修改

如果需要對同一文件或行作多次修改,可以有三種方法來實現它。第一種是使用 "-e" 選項,它通知程序使用了多條編輯命令。例如:

$ echo The tiger cubs will meet on Tuesday after school | sed -e '
s/tiger/wolf/' -e 's/after/before/'
The wolf cubs will meet on Tuesday before school
$

這是實現它的非常復雜的方法,因此 "-e" 選項不常被大范圍使用。更好的方法是用分號來分隔命令:

$ echo The tiger cubs will meet on Tuesday after school | sed '
s/tiger/wolf/; s/after/before/'
The wolf cubs will meet on Tuesday before school
$

注 意分號必須是緊跟斜線之後的下一個字元。如果兩者之間有一個空格,操作將不能成功完成,並返回一條錯誤消息。這兩種方法都很好,但許多管理員更喜歡另一種 方法。要注意的一個關鍵問題是,兩個撇號 (' ') 之間的全部內容都被解釋為 sed 命令。直到您輸入了第二個撇號,讀入這些命令的 shell 程序才會認為您完成了輸入。這意味著可以在多行上輸入命令—同時 Linux 將提示符從 PS1 變為一個延續提示符(通常為 ">")—直到輸入了第二個撇號。一旦輸入了第二個撇號,並且按下了 Enter 鍵,則處理就進行並產生相同的結果,如下所示:

$ echo The tiger cubs will meet on Tuesday after school | sed '
> s/tiger/wolf/
> s/after/before/'
The wolf cubs will meet on Tuesday before school
$

全局修改

讓我們開始一次看似簡單的編輯。假定在要修改的消息中出現了多次要修改的項目。默認方式下,結果可能和預期的有所不同,如下所示:

$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/'
The tiger cubs will meet this Thursday at the same time
as the meeting last Tuesday
$

與 將出現的每個 "Tuesday" 修改為 "Thursday" 相反,sed 編輯器在找到一個要修改的項目並作了修改之後繼續處理下一行,而不讀整行。sed 命令功能大體上類似於替換命令,這意味著它們都處理每一行中出現的第一個選定序列。為了替換出現的每一個項目,在同一行中出現多個要替換的項目的情況下, 您必須指定在全局進行該操作:

$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/g'
The tiger cubs will meet this Thursday at the same time
as the meeting last Thursday
$

請記住不管您要查找的序列是否僅包含一個字元或片語,這種對全局化的要求都是必需的。

sed 還可以用來修改記錄欄位分隔符。例如,以下命令將把所有的 tab 修改為空格:

sed 's// /g'

其 中,第一組斜線之間的項目是一個 tab,而第二組斜線之間的項目是一個空格。作為一條通用的規則,sed 可以用來將任意的可列印字元修改為任意其它的可列印字元。如果您想將不可列印字元修改為可列印字元—例如,鈴鐺修改為單詞 "bell"—sed 不是適於完成這項工作的工具(但 tr 是)。

有時,您不想修改在一個文件中出現的所有指定項目。有時,您只想在滿足某些條件時才作修改—例如,在與其它一些數據匹配之後才作修改。為了說明這一點,請考慮以下文本文件:

$ cat sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
$

假定希望用 "2" 來替換 "1",但僅在單詞 "two" 之後才作替換,而不是每一行的所有位置。通過指定在給出替換命令之前必須存在一次匹配,可以實現這一點:

$ sed '/two/ s/1/2/' sample_one
one 1
two 2
three 1
one 1
two 2
two 2
three 1
$

現在,使其更加准確:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

請 再次記住唯一改變了的是顯示。如果您查看源文件,您將發現它始終保持不變。您必須將輸出保存至另一個文件,以實現永久保存。值得重復的是,不對源文件作修 改實際是禍中有福—它讓您能夠對文件進行試驗而不會造成任何實際的損害,直到讓正確命令以您預期和希望的方式進行工作。

以下命令將修改後的輸出保存至一個新的文件:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one > sample_two

該輸出文件將所有修改合並在其中,並且這些修改通常將在屏幕上顯示。現在可以用 head、cat 或任意其它類似的實用工具來進行查看。

腳本文件

sed 工具允許您創建一個腳本文件,其中包含從該文件而不是在命令行進行處理的命令,並且 sed 工具通過 "-f" 選項來引用。通過創建一個腳本文件,您能夠一次又一次地重復運行相同的操作,並指定比每次希望從命令行進行處理的操作詳細得多的操作。

考慮以下腳本文件:

$ cat sedlist
/two/ s/1/2/
/three/ s/1/3/
$

現在可以在數據文件上使用腳本文件,獲得和我們之前看到的相同的結果:

$ sed -f sedlist sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

注意當調用 "-f" 選項時,在源文件內或命令行中不使用撇號。腳本文件,也稱為源文件,對於想重復多次的操作和從命令行運行可能出錯的復雜命令很有價值。編輯源文件並修改一個字元比在命令行中重新輸入一條多行的項目要容易得多。

限制行

編輯器默認查看輸入到流編輯器中的每一行,且默認在輸入到流編輯器中的每一行上進行編輯。這可以通過在發出命令之前指定約束條件來進行修改。例如,只在此示例文件的輸出的第 5 和第 6 行中用 "2" 來替換 "1",命令將為:

$ sed '5,6 s/1/2/' sample_one
one 1
two 1
three 1
one 1
two 2
two 2
three 1
$

在這種情況下,因為要修改的行是專門指定的,所以不需要替換命令。因此,您可以靈活地根據匹配准則(可以是行號或一種匹配模式)來選擇要修改哪些行(從根本上限制修改)。

禁止顯示

sed 默認將來自源文件的每一行顯示到屏幕上(或重定向到一個文件中),而無論該行是否受到編輯操作的影響,"-n" 參數覆蓋了這一操作。"-n" 覆蓋了所有的顯示,並且不顯示任何一行,而無論它們是否被編輯操作修改。例如:

$ sed -n -f sedlist sample_one
$

$ sed -n -f sedlist sample_one > sample_two
$ cat sample_two
$

在 第一個示例中,屏幕上不顯示任何東西。在第二個示例中,不修改任何東西,因此不將任何東西寫到新的文件中—它最後是空的。這不是否定了編輯的全部目的嗎? 為什麼這是有用的?它是有用的僅因為 "-n" 選項能夠被一條顯示命令 (-p) 覆蓋。為了說明這一點,假定現在像下面這樣對腳本文件進行了修改:

$ cat sedlist
/two/ s/1/2/p
/three/ s/1/3/p
$

然後下面是運行它的結果:

$ sed -n -f sedlist sample_one
two 2
three 3
two 2
two 2
three 3
$

保持不變的行全部不被顯示。只有受到編輯操作影響的行被顯示了。在這種方式下,可以僅取出這些行,進行修改,然後把它們放到一個單獨的文件中:

$ sed -n -f sedlist sample_one > sample_two
$

$ cat sample_two
two 2
three 3
two 2
two 2
three 3
$

利用它的另一種方法是只顯示一定數量的行。例如,只顯示 2-6 行,同時不做其它的編輯修改:

$ sed -n '2,6p' sample_one
two 1
three 1
one 1
two 1
two 1
$

其它所有的行被忽略,只有 2-6 行作為輸出顯示。這是一項出色的功能,其它任何工具都不能容易地實現。Head 將顯示一個文件的頂部,而 tail 將顯示一個文件的底部,但 sed 允許從任意位置取出想要的任意內容。

刪除行

用一個值替換另一個值遠非流編輯器可以執行的唯一功能。它還具有許多的潛在功能,在我看來第二種最常用的功能是刪除。刪除與替換的工作方式相同,只是它刪除指定的行(如果您想要刪除一個單詞而不是一行,不要考慮刪除,而應考慮用空的內容來替換它—s/cat//)。

該命令的語法是:

'{what to find} d'

從 sample_one 文件中刪除包含 "two" 的所有行:

$ sed '/two/ d' sample_one
one 1
three 1
one 1
three 1
$

從顯示屏中刪除前三行,而不管它們的內容是什麼:

$ sed '1,3 d' sample_one
one 1
two 1
two 1
three 1
$

只顯示剩下的行,前三行不在顯示屏中出現。對於流編輯器,一般當它們涉及到全局表達式時,特別是應用於刪除操作時,有幾點要記住:

上三角號 (^) 表示一行的開始,因此,如果 "two" 是該行的頭三個字元,則

sed '/^two/ d' sample_one

將只刪除該行。
美元符號 ($) 代表文件的結尾,或一行的結尾,因此,如果 "two" 是該行的最後三個字元,則

sed '/two$/ d' sample_one

將只刪除該行。

將這兩者結合在一起的結果:

sed '/^$/ d' {filename}

刪除文件中的所有空白行。例如,以下命令將 "1" 替換為 "2",以及將 "1" 替換為 "3",並刪除文件中所有尾隨的空行:

$ sed '/two/ s/1/2/; /three/ s/1/3/; /^$/ d' sample_one
one 1
two 1
three 1
one 1
two 2
two 2
three 1
$

其通常的用途是刪除一個標題。以下命令將刪除文件中所有的行,從第一行直到第一個空行:

sed '1,/^$/ d' {filename}

添加和插入文本

可以結合使用 sed 和 "a" 選項將文本添加到一個文件的末尾。實現方法如下:

$ sed '$a
> This is where we stop
> the test' sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
This is where we stop
the test
$

在該命令中,美元符號 ($) 表示文本將被添加到文件的末尾。反斜線 () 是必需的,它表示將插入一個回車符。如果它們被遺漏了,則將導致一個錯誤,顯示該命令是錯亂的;在任何要輸入回車的地方您必須使用反斜線。

要將這些行添加到第 4 和第 5 個位置而不是末尾,則命令變為:

$ sed '3a
> This is where we stop
> the test' sample_one
one 1
two 1
three 1
This is where we stop
the test
one 1
two 1
two 1
three 1
$

這將文本添加到第 3 行之後。和幾乎所有的編輯器一樣,您可以選擇插入而不是添加(如果您希望這樣的話)。這兩者的區別是添加跟在指定的行之後,而插入從指定的行開始。當用插入來代替添加時,只需用 "i" 來代替 "a",如下所示:

$ sed '3i
> This is where we stop
> the test' sample_one
one 1
two 1
This is where we stop
the test
three 1
one 1
two 1
two 1
three 1
$

新的文本出現在輸出的中間位置,而處理通常在指定的操作執行以後繼續進行。

讀寫文件

重定向輸出的功能已經演示過了,但需要指出的是,在編輯命令運行期間可以同步地讀入和寫出文件。例如,執行替換,並將 1-3 行寫到名稱為 sample_three 的文件中:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 1,3 w sample_three' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

$ cat sample_three
one 1
two 2
three 3
$

由於為 w (write) 命令指定了 "1,3",所以只有指定的行被寫到了新文件中。無論被寫的是哪些行,所有的行都在默認輸出中顯示。

修改命令

除了替換項目之外,還可以將行從一個值修改為另一個值。要記住的是,替換是對字元逐個進行,而修改功能與刪除類似,它影響整行:

$ sed '/two/ c
> We are no longer using two' sample_one
one 1
We are no longer using two
three 1
one 1
We are no longer using two
We are no longer using two
three 1
$

修 改命令與替換的工作方式很相似,但在范圍上要更大些—將一個項目完全替換為另一個項目,而無論字元內容或上下文。誇張一點講,當使用替換時,只有字元 "1" 被字元 "2" 替換,而當使用修改時,原來的整行將被修改。在兩種情況下,要尋找的匹配條件都僅為 "two"。

修改全部但……

對於大多數 sed 命令,詳細說明各種功能要進行何種修改。利用感嘆號,可以在除指定位置之外的任何地方執行修改—與默認的操作完全相反。

例如,要刪除包含單詞 "two" 的所有行,操作為:

$ sed '/two/ d' sample_one
one 1
three 1
one 1
three 1
$

而要刪除除包含單詞 "two" 的行之外的所有行,則語法變為:

$ sed '/two/ !d' sample_one
two 1
two 1
two 1
$

如果您有一個文件包含一系列項目,並且想對文件中的每個項目執行一個操作,那麼首先對那些項目進行一次智能掃描並考慮將要做什麼是很重要的。為了使事情變得更簡單,您可以將 sed 與任意迭代常式(for、while、until)結合來實現這一目的。

比如說,假定您有一個名為 "animals" 的文件,其中包含以下項目:

pig
horse
elephant
cow
dog
cat

您希望運行以下常式:

#mcd.ksh
for I in $*
do
echo Old McDonald had a $I
echo E-I, E-I-O
done

結 果將為,每一行都顯示在 "Old McDonald has a" 的末尾。雖然對於這些項目的大部分這是正確的,但對於 "elephant" 項目,它有語法錯誤,因為結果應當為 "an elephant" 而不是 "a elephant"。利用 sed,您可以在來自 shell 文件的輸出中檢查這種語法錯誤,並通過首先創建一個命令文件來即時地更正它們:

#sublist
/ a a/ s/ a / an /
/ a e/ s/ a / an /
/a i/ s / a / an /
/a o/ s/ a / an /
/a u/ s/ a / an /

然後執行以下過程:

$ sh mcd.ksh 'cat animals' | sed -f sublist

現 在,在運行了 mcd 腳本之後,sed 將在輸出中搜索單個字母 a (空格,"a",空格)之後緊跟了一個母音的任意位置。如果這種位置存在,它將把該序列修改為空格,"an",空格。這樣就使問題更正後才顯示在屏幕上, 並確保各處的編輯人員在晚上可以更容易地入睡。結果是:

Old McDonald had a pig
E-I, E-I-O
Old McDonald had a horse
E-I, E-I-O
Old McDonald had an elephant
E-I, E-I-O
Old McDonald had a cow
E-I, E-I-O
Old McDonald had a dog
E-I, E-I-O
Old McDonald had a cat
E-I, E-I-O

提前退出

sed 默認讀取整個文件,並只在到達末尾時才停止。不過,您可以使用退出命令提前停止處理。只能指定一條退出命令,而處理將一直持續直到滿足調用退出命令的條件。

例如,僅在文件的前五行上執行替換,然後退出:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 5q' sample_one
one 1
two 2
three 3
one 1
two 2
$

在退出命令之前的項目可以是一個行號(如上所示),或者一條查找/匹配命令:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> /three/q' sample_one
one 1
two 2
three 3
$

您 還可以使用退出命令來查看超過一定標准數目的行,並增加比 head 中的功能更強的功能。例如,head 命令允許您指定您想要查看一個文件的前多少行—默認數為 10,但可以使用從 1 到 99 的任意一個數字。如果您想查看一個文件的前 110 行,您用 head 不能實現這一目的,但用 sed 可以:

sed 110q filename

處理問題

當使用 sed 時,要記住的重要事項是它的工作方式。它的工作方式是:讀入一行,在該行上執行它已知要執行的所有任務,然後繼續處理下一行。每一行都受給定的每一個編輯命令的影響。

如果您的操作順序沒有十分徹底地考慮清楚,那麼這可能會很麻煩。例如,假定您需要將所有的 "two" 項目修改為 "three",然後將所有的 "three" 修改為 "four":

$ sed '
> /two/ s/two/three/
> /three/ s/three/four/' sample_one
one 1
four 1
four 1
one 1
four 1
four 1
four 1
$

最初讀取的 "two" 被修改為 "three"。然後它滿足為下一次編輯建立的准則,從而變為 "four"。最終的結果不是想要的結果—現在除了 "four" 沒有別的項目了,而本來應該有 "three" 和 "four"。

當執行這種操作時,您必須非常用心地注意指定操作的方式,並按某種順序來安排它們,使得操作之間不會互相影響。例如:

$ sed '
> /three/ s/three/four/
> /two/ s/two/three/' sample_one
one 1
three 1
four 1
one 1
three 1
three 1
four 1
$

這非常有效,因為 "three" 值在 "two" 變成 "three" 之前得到修改。

標簽和注釋

可以在 sed 腳本文件中放置標簽,這樣一旦文件變得龐大,可以更容易地說明正在發生的事情。存在各種各樣與這些標簽相關的命令,它們包括:
接下來的步驟

訪問並收藏 Linux 技術中心

閱讀 Dale Dougherty 和 Arnold Robbins 的著作 sed & awk, 2nd Edition (O'Reilly & Associates 出版社)。

: 冒號表示一個標簽名稱。例如:

:HERE

以冒號開始的標簽可以由 "b" 和 "t" 命令處理。

b {label} 充當 "goto" 語句的作用,將處理發送至前面有一個冒號的標簽。例如,

b HERE

將處理發送給行

:HERE

如果緊跟 b 之後沒有指定任何標簽,則處理轉至腳本文件的末尾。

t {label} 只要自上次輸入行或執行一次 "t" 命令以來進行了替換操作,就轉至該標簽。和 "b" 一樣,如果沒有給定標簽名,則處理轉至腳本文件的末尾。

# 符號作為一行的第一個字元將使整行被當作注釋處理。注釋行與標簽不同,不能使用 b 或 t 命令來轉到注釋行上。

C. SED是什麼意思

SED(Surface-conction Electron-emitter Display)談到平板顯示技術,多數人可能只知道液晶和等離子,有人可能還知道有機發光二極體(OLED)顯示技術、電致發光EL顯示技術和電子紙,但對SED這種顯示技術,知道的人可能就不多了。在畫質上,SED全面勝過了液晶和等離子電視,而且功耗也比同尺寸的液晶和等離子電視低得多。SED的橫空出世,讓人們又多了一個選擇。

sed是stream editor的縮寫。是一個非互動式上下文(context)編輯器,它被設計在下列三種情況下發揮作用: 1) 編輯那些對舒適的互動式編輯而言太大的文件。 2) 在編輯命令太復雜而難於在交互模式下鍵入的時候編輯任何大小的文件。 3) 要在對輸入的一趟掃描中有效的進行多個『全局』(global)編輯函數。

中美戰略經濟對話: China Strategic Economic Dialogue ;US Strategic and Economic Dialogue ;US Strategic Economic Dialogue 中美戰略經濟對話機制: Strategic Economic Dialogue 中美戰略與經濟對話: Strategic and Economic Dialogue ;China Strategic and Economic Dialogue ;Us Strategic and Economic Dialogue

D. awk和sed是做什麼用的,有什麼區別

非常強大的文本操縱工具,sed,awk,grep 這個三個命令 都是操作文本文件的
unix系統有幾個非常命令的特點:
1. 對於內核而言,unix文件都是位元組序列。io設備也是文件。
2. 至於文件的含義交由應用程序來解釋。其中文本文件非常重要,因為unix提供 很多了實用程序(utility),這些程序功能相對獨立,但可以通過管道來實現進程間通信(IPC),這樣鬆散的耦合可以完成復雜的操作。那麼進程間的通信的數據格式是怎樣的呢? 其實對於實用程序而言,這個數據格式就是簡單的文本文件。此外,還有IO重定向,也是一個不錯的創意。至於文本文件中的內容採用什麼格式呢?這個很具體的命令有關,那麼操作文本就變得非常重要。grep,sed和awk就是三個操縱文本文件的命令
grep搜索
sed 修改和編輯文本文件中某些行,也可以搜索
awk 是訪問文本文件,操縱文本文件中某些數據,進行搜索統計運算

E. linux裡面的sed命令怎麼用,做什麼的請詳細說明

sed 編輯器是 Linux 系統管理員的工具包中最有用的資產之一

Linux 操作系統最大的一個好處是它帶有各種各樣的實用工具。存在如此之多不同的實用工具,幾乎不可能知道並了解所有這些工具。可以簡化關鍵情況下操作的一個實用 工具是 sed。它是任何管理員的工具包中最強大的工具之一,並且可以證明它自己在關鍵情況下非常有價值。

sed 實用工具是一個「編輯器」,但它與其它大多數編輯器不同。除了不面向屏幕之外,它還是非互動式的。這意味著您必須將要對數據執行的命令插入到命令行或要處 理的腳本中。當顯示它時,請忘記您在使用 Microsoft Word 或其它大多數編輯器時擁有的互動式編輯文件功能。sed 在一個文件(或文件集)中非互動式、並且不加詢問地接收一系列的命令並執行它們。因而,它流經文本就如同水流經溪流一樣,因而 sed 恰當地代表了流編輯器。它可以用來將所有出現的 "Mr. Smyth" 修改為 "Mr. Smith",或將 "tiger cub" 修改為 "wolf cub"。流編輯器非常適合於執行重復的編輯,這種重復編輯如果由人工完成將花費大量的時間。其參數可能和一次性使用一個簡單的操作所需的參數一樣有限, 或者和一個具有成千上萬行要進行編輯修改的腳本文件一樣復雜。sed 是 Linux 和 UNIX 工具箱中最有用的工具之一,且使用的參數非常少。

sed 的工作方式

sed 實用工具按順序逐行將文件讀入到內存中。然後,它執行為該行指定的所有操作,並在完成請求的修改之後將該行放回到內存中,以將其轉儲至終端。完成了這一行 上的所有操作之後,它讀取文件的下一行,然後重復該過程直到它完成該文件。如同前面所提到的,默認輸出是將每一行的內容輸出到屏幕上。在這里,開始涉及到 兩個重要的因素—首先,輸出可以被重定向到另一文件中,以保存變化;第二,源文件(默認地)保持不被修改。sed 默認讀取整個文件並對其中的每一行進行修改。不過,可以按需要將操作限制在指定的行上。

該實用工具的語法為:

sed [options] '{command}' [filename]

在這篇文章中,我們將瀏覽最常用的命令和選項,並演示它們如何工作,以及它們適於在何處使用。

替換命令

sed 實用工具以及其它任何類似的編輯器的最常用的命令之一是用一個值替換另一個值。用來實現這一目的的操作的命令部分語法是:

's/{old value}/{new value}/'

因而,下面演示了如何非常簡單地將 "tiger" 修改為 "wolf":

$ echo The tiger cubs will meet on Tuesday after school | sed
's/tiger/wolf/'
The wolf cubs will meet on Tuesday after school
$

注意如果輸入是源自之前的命令輸出,則不需要指定文件名—同樣的原則也適用於 awk、sort 和其它大多數 LinuxUNIX 命令行實用工具程序。

多次修改

如果需要對同一文件或行作多次修改,可以有三種方法來實現它。第一種是使用 "-e" 選項,它通知程序使用了多條編輯命令。例如:

$ echo The tiger cubs will meet on Tuesday after school | sed -e '
s/tiger/wolf/' -e 's/after/before/'
The wolf cubs will meet on Tuesday before school
$

這是實現它的非常復雜的方法,因此 "-e" 選項不常被大范圍使用。更好的方法是用分號來分隔命令:

$ echo The tiger cubs will meet on Tuesday after school | sed '
s/tiger/wolf/; s/after/before/'
The wolf cubs will meet on Tuesday before school
$

注 意分號必須是緊跟斜線之後的下一個字元。如果兩者之間有一個空格,操作將不能成功完成,並返回一條錯誤消息。這兩種方法都很好,但許多管理員更喜歡另一種 方法。要注意的一個關鍵問題是,兩個撇號 (' ') 之間的全部內容都被解釋為 sed 命令。直到您輸入了第二個撇號,讀入這些命令的 shell 程序才會認為您完成了輸入。這意味著可以在多行上輸入命令—同時 Linux 將提示符從 PS1 變為一個延續提示符(通常為 ">")—直到輸入了第二個撇號。一旦輸入了第二個撇號,並且按下了 Enter 鍵,則處理就進行並產生相同的結果,如下所示:

$ echo The tiger cubs will meet on Tuesday after school | sed '
> s/tiger/wolf/
> s/after/before/'
The wolf cubs will meet on Tuesday before school
$

全局修改

讓我們開始一次看似簡單的編輯。假定在要修改的消息中出現了多次要修改的項目。默認方式下,結果可能和預期的有所不同,如下所示:

$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/'
The tiger cubs will meet this Thursday at the same time
as the meeting last Tuesday
$

與 將出現的每個 "Tuesday" 修改為 "Thursday" 相反,sed 編輯器在找到一個要修改的項目並作了修改之後繼續處理下一行,而不讀整行。sed 命令功能大體上類似於替換命令,這意味著它們都處理每一行中出現的第一個選定序列。為了替換出現的每一個項目,在同一行中出現多個要替換的項目的情況下, 您必須指定在全局進行該操作:

$ echo The tiger cubs will meet this Tuesday at the same time
as the meeting last Tuesday | sed 's/Tuesday/Thursday/g'
The tiger cubs will meet this Thursday at the same time
as the meeting last Thursday
$

請記住不管您要查找的序列是否僅包含一個字元或片語,這種對全局化的要求都是必需的。

sed 還可以用來修改記錄欄位分隔符。例如,以下命令將把所有的 tab 修改為空格:

sed 's// /g'

其 中,第一組斜線之間的項目是一個 tab,而第二組斜線之間的項目是一個空格。作為一條通用的規則,sed 可以用來將任意的可列印字元修改為任意其它的可列印字元。如果您想將不可列印字元修改為可列印字元—例如,鈴鐺修改為單詞 "bell"—sed 不是適於完成這項工作的工具(但 tr 是)。

有時,您不想修改在一個文件中出現的所有指定項目。有時,您只想在滿足某些條件時才作修改—例如,在與其它一些數據匹配之後才作修改。為了說明這一點,請考慮以下文本文件:

$ cat sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
$

假定希望用 "2" 來替換 "1",但僅在單詞 "two" 之後才作替換,而不是每一行的所有位置。通過指定在給出替換命令之前必須存在一次匹配,可以實現這一點:

$ sed '/two/ s/1/2/' sample_one
one 1
two 2
three 1
one 1
two 2
two 2
three 1
$

現在,使其更加准確:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

請 再次記住唯一改變了的是顯示。如果您查看源文件,您將發現它始終保持不變。您必須將輸出保存至另一個文件,以實現永久保存。值得重復的是,不對源文件作修 改實際是禍中有福—它讓您能夠對文件進行試驗而不會造成任何實際的損害,直到讓正確命令以您預期和希望的方式進行工作。

以下命令將修改後的輸出保存至一個新的文件:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/' sample_one > sample_two

該輸出文件將所有修改合並在其中,並且這些修改通常將在屏幕上顯示。現在可以用 head、cat 或任意其它類似的實用工具來進行查看。

腳本文件

sed 工具允許您創建一個腳本文件,其中包含從該文件而不是在命令行進行處理的命令,並且 sed 工具通過 "-f" 選項來引用。通過創建一個腳本文件,您能夠一次又一次地重復運行相同的操作,並指定比每次希望從命令行進行處理的操作詳細得多的操作。

考慮以下腳本文件:

$ cat sedlist
/two/ s/1/2/
/three/ s/1/3/
$

現在可以在數據文件上使用腳本文件,獲得和我們之前看到的相同的結果:

$ sed -f sedlist sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

注意當調用 "-f" 選項時,在源文件內或命令行中不使用撇號。腳本文件,也稱為源文件,對於想重復多次的操作和從命令行運行可能出錯的復雜命令很有價值。編輯源文件並修改一個字元比在命令行中重新輸入一條多行的項目要容易得多。

限制行

編輯器默認查看輸入到流編輯器中的每一行,且默認在輸入到流編輯器中的每一行上進行編輯。這可以通過在發出命令之前指定約束條件來進行修改。例如,只在此示例文件的輸出的第 5 和第 6 行中用 "2" 來替換 "1",命令將為:

$ sed '5,6 s/1/2/' sample_one
one 1
two 1
three 1
one 1
two 2
two 2
three 1
$

在這種情況下,因為要修改的行是專門指定的,所以不需要替換命令。因此,您可以靈活地根據匹配准則(可以是行號或一種匹配模式)來選擇要修改哪些行(從根本上限制修改)。

禁止顯示

sed 默認將來自源文件的每一行顯示到屏幕上(或重定向到一個文件中),而無論該行是否受到編輯操作的影響,"-n" 參數覆蓋了這一操作。"-n" 覆蓋了所有的顯示,並且不顯示任何一行,而無論它們是否被編輯操作修改。例如:

$ sed -n -f sedlist sample_one
$

$ sed -n -f sedlist sample_one > sample_two
$ cat sample_two
$

在 第一個示例中,屏幕上不顯示任何東西。在第二個示例中,不修改任何東西,因此不將任何東西寫到新的文件中—它最後是空的。這不是否定了編輯的全部目的嗎? 為什麼這是有用的?它是有用的僅因為 "-n" 選項能夠被一條顯示命令 (-p) 覆蓋。為了說明這一點,假定現在像下面這樣對腳本文件進行了修改:

$ cat sedlist
/two/ s/1/2/p
/three/ s/1/3/p
$

然後下面是運行它的結果:

$ sed -n -f sedlist sample_one
two 2
three 3
two 2
two 2
three 3
$

保持不變的行全部不被顯示。只有受到編輯操作影響的行被顯示了。在這種方式下,可以僅取出這些行,進行修改,然後把它們放到一個單獨的文件中:

$ sed -n -f sedlist sample_one > sample_two
$

$ cat sample_two
two 2
three 3
two 2
two 2
three 3
$

利用它的另一種方法是只顯示一定數量的行。例如,只顯示 2-6 行,同時不做其它的編輯修改:

$ sed -n '2,6p' sample_one
two 1
three 1
one 1
two 1
two 1
$

其它所有的行被忽略,只有 2-6 行作為輸出顯示。這是一項出色的功能,其它任何工具都不能容易地實現。Head 將顯示一個文件的頂部,而 tail 將顯示一個文件的底部,但 sed 允許從任意位置取出想要的任意內容。

刪除行

用一個值替換另一個值遠非流編輯器可以執行的唯一功能。它還具有許多的潛在功能,在我看來第二種最常用的功能是刪除。刪除與替換的工作方式相同,只是它刪除指定的行(如果您想要刪除一個單詞而不是一行,不要考慮刪除,而應考慮用空的內容來替換它—s/cat//)。

該命令的語法是:

'{what to find} d'

從 sample_one 文件中刪除包含 "two" 的所有行:

$ sed '/two/ d' sample_one
one 1
three 1
one 1
three 1
$

從顯示屏中刪除前三行,而不管它們的內容是什麼:

$ sed '1,3 d' sample_one
one 1
two 1
two 1
three 1
$

只顯示剩下的行,前三行不在顯示屏中出現。對於流編輯器,一般當它們涉及到全局表達式時,特別是應用於刪除操作時,有幾點要記住:

上三角號 (^) 表示一行的開始,因此,如果 "two" 是該行的頭三個字元,則

sed '/^two/ d' sample_one

將只刪除該行。
美元符號 ($) 代表文件的結尾,或一行的結尾,因此,如果 "two" 是該行的最後三個字元,則

sed '/two$/ d' sample_one

將只刪除該行。

將這兩者結合在一起的結果:

sed '/^$/ d' {filename}

刪除文件中的所有空白行。例如,以下命令將 "1" 替換為 "2",以及將 "1" 替換為 "3",並刪除文件中所有尾隨的空行:

$ sed '/two/ s/1/2/; /three/ s/1/3/; /^$/ d' sample_one
one 1
two 1
three 1
one 1
two 2
two 2
three 1
$

其通常的用途是刪除一個標題。以下命令將刪除文件中所有的行,從第一行直到第一個空行:

sed '1,/^$/ d' {filename}

添加和插入文本

可以結合使用 sed 和 "a" 選項將文本添加到一個文件的末尾。實現方法如下:

$ sed '$a
> This is where we stop
> the test' sample_one
one 1
two 1
three 1
one 1
two 1
two 1
three 1
This is where we stop
the test
$

在該命令中,美元符號 ($) 表示文本將被添加到文件的末尾。反斜線 () 是必需的,它表示將插入一個回車符。如果它們被遺漏了,則將導致一個錯誤,顯示該命令是錯亂的;在任何要輸入回車的地方您必須使用反斜線。

要將這些行添加到第 4 和第 5 個位置而不是末尾,則命令變為:

$ sed '3a
> This is where we stop
> the test' sample_one
one 1
two 1
three 1
This is where we stop
the test
one 1
two 1
two 1
three 1
$

這將文本添加到第 3 行之後。和幾乎所有的編輯器一樣,您可以選擇插入而不是添加(如果您希望這樣的話)。這兩者的區別是添加跟在指定的行之後,而插入從指定的行開始。當用插入來代替添加時,只需用 "i" 來代替 "a",如下所示:

$ sed '3i
> This is where we stop
> the test' sample_one
one 1
two 1
This is where we stop
the test
three 1
one 1
two 1
two 1
three 1
$

新的文本出現在輸出的中間位置,而處理通常在指定的操作執行以後繼續進行。

讀寫文件

重定向輸出的功能已經演示過了,但需要指出的是,在編輯命令運行期間可以同步地讀入和寫出文件。例如,執行替換,並將 1-3 行寫到名稱為 sample_three 的文件中:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 1,3 w sample_three' sample_one
one 1
two 2
three 3
one 1
two 2
two 2
three 3
$

$ cat sample_three
one 1
two 2
three 3
$

由於為 w (write) 命令指定了 "1,3",所以只有指定的行被寫到了新文件中。無論被寫的是哪些行,所有的行都在默認輸出中顯示。

修改命令

除了替換項目之外,還可以將行從一個值修改為另一個值。要記住的是,替換是對字元逐個進行,而修改功能與刪除類似,它影響整行:

$ sed '/two/ c
> We are no longer using two' sample_one
one 1
We are no longer using two
three 1
one 1
We are no longer using two
We are no longer using two
three 1
$

修 改命令與替換的工作方式很相似,但在范圍上要更大些—將一個項目完全替換為另一個項目,而無論字元內容或上下文。誇張一點講,當使用替換時,只有字元 "1" 被字元 "2" 替換,而當使用修改時,原來的整行將被修改。在兩種情況下,要尋找的匹配條件都僅為 "two"。

修改全部但……

對於大多數 sed 命令,詳細說明各種功能要進行何種修改。利用感嘆號,可以在除指定位置之外的任何地方執行修改—與默認的操作完全相反。

例如,要刪除包含單詞 "two" 的所有行,操作為:

$ sed '/two/ d' sample_one
one 1
three 1
one 1
three 1
$

而要刪除除包含單詞 "two" 的行之外的所有行,則語法變為:

$ sed '/two/ !d' sample_one
two 1
two 1
two 1
$

如果您有一個文件包含一系列項目,並且想對文件中的每個項目執行一個操作,那麼首先對那些項目進行一次智能掃描並考慮將要做什麼是很重要的。為了使事情變得更簡單,您可以將 sed 與任意迭代常式(for、while、until)結合來實現這一目的。

比如說,假定您有一個名為 "animals" 的文件,其中包含以下項目:

pig
horse
elephant
cow
dog
cat

您希望運行以下常式:

#mcd.ksh
for I in $*
do
echo Old McDonald had a $I
echo E-I, E-I-O
done

結 果將為,每一行都顯示在 "Old McDonald has a" 的末尾。雖然對於這些項目的大部分這是正確的,但對於 "elephant" 項目,它有語法錯誤,因為結果應當為 "an elephant" 而不是 "a elephant"。利用 sed,您可以在來自 shell 文件的輸出中檢查這種語法錯誤,並通過首先創建一個命令文件來即時地更正它們:

#sublist
/ a a/ s/ a / an /
/ a e/ s/ a / an /
/a i/ s / a / an /
/a o/ s/ a / an /
/a u/ s/ a / an /

然後執行以下過程:

$ sh mcd.ksh 'cat animals' | sed -f sublist

現 在,在運行了 mcd 腳本之後,sed 將在輸出中搜索單個字母 a (空格,"a",空格)之後緊跟了一個母音的任意位置。如果這種位置存在,它將把該序列修改為空格,"an",空格。這樣就使問題更正後才顯示在屏幕上, 並確保各處的編輯人員在晚上可以更容易地入睡。結果是:

Old McDonald had a pig
E-I, E-I-O
Old McDonald had a horse
E-I, E-I-O
Old McDonald had an elephant
E-I, E-I-O
Old McDonald had a cow
E-I, E-I-O
Old McDonald had a dog
E-I, E-I-O
Old McDonald had a cat
E-I, E-I-O

提前退出

sed 默認讀取整個文件,並只在到達末尾時才停止。不過,您可以使用退出命令提前停止處理。只能指定一條退出命令,而處理將一直持續直到滿足調用退出命令的條件。

例如,僅在文件的前五行上執行替換,然後退出:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> 5q' sample_one
one 1
two 2
three 3
one 1
two 2
$

在退出命令之前的項目可以是一個行號(如上所示),或者一條查找/匹配命令:

$ sed '
> /two/ s/1/2/
> /three/ s/1/3/
> /three/q' sample_one
one 1
two 2
three 3
$

您 還可以使用退出命令來查看超過一定標准數目的行,並增加比 head 中的功能更強的功能。例如,head 命令允許您指定您想要查看一個文件的前多少行—默認數為 10,但可以使用從 1 到 99 的任意一個數字。如果您想查看一個文件的前 110 行,您用 head 不能實現這一目的,但用 sed 可以:

sed 110q filename

處理問題

當使用 sed 時,要記住的重要事項是它的工作方式。它的工作方式是:讀入一行,在該行上執行它已知要執行的所有任務,然後繼續處理下一行。每一行都受給定的每一個編輯命令的影響。

如果您的操作順序沒有十分徹底地考慮清楚,那麼這可能會很麻煩。例如,假定您需要將所有的 "two" 項目修改為 "three",然後將所有的 "three" 修改為 "four":

$ sed '
> /two/ s/two/three/
> /three/ s/three/four/' sample_one
one 1
four 1
four 1
one 1
four 1
four 1
four 1
$

最初讀取的 "two" 被修改為 "three"。然後它滿足為下一次編輯建立的准則,從而變為 "four"。最終的結果不是想要的結果—現在除了 "four" 沒有別的項目了,而本來應該有 "three" 和 "four"。

當執行這種操作時,您必須非常用心地注意指定操作的方式,並按某種順序來安排它們,使得操作之間不會互相影響。例如:

$ sed '
> /three/ s/three/four/
> /two/ s/two/three/' sample_one
one 1
three 1
four 1
one 1
three 1
three 1
four 1
$

這非常有效,因為 "three" 值在 "two" 變成 "three" 之前得到修改。

標簽和注釋

可以在 sed 腳本文件中放置標簽,這樣一旦文件變得龐大,可以更容易地說明正在發生的事情。存在各種各樣與這些標簽相關的命令,它們包括:
接下來的步驟

訪問並收藏 Linux 技術中心

閱讀 Dale Dougherty 和 Arnold Robbins 的著作 sed & awk, 2nd Edition (O'Reilly & Associates 出版社)。

: 冒號表示一個標簽名稱。例如:

:HERE

以冒號開始的標簽可以由 "b" 和 "t" 命令處理。

b {label} 充當 "goto" 語句的作用,將處理發送至前面有一個冒號的標簽。例如,

b HERE

將處理發送給行

:HERE

如果緊跟 b 之後沒有指定任何標簽,則處理轉至腳本文件的末尾。

t {label} 只要自上次輸入行或執行一次 "t" 命令以來進行了替換操作,就轉至該標簽。和 "b" 一樣,如果沒有給定標簽名,則處理轉至腳本文件的末尾。

# 符號作為一行的第一個字元將使整行被當作注釋處理。注釋行與標簽不同,不能使用 b 或 t 命令來轉到注釋行上。

F. 關於Linux里的sed命令。

Sed
is
a
nondestructive
editor.
It
will
display
the
edits
you
make
on
your
screen,
but
it
will
not
change
the
file
you
are
editing.
To
really
reflect
the
edits
in
the
file,
you
must
redirect
the
output
to
another
file,
and
then
rename
the
orginal
file
sed的特點就是非破壞(nondestructive),流水行(streamlined),非交互(noninteractive)的編輯器。
非破壞就是指不會修改原文件,它會將修改的結果標准輸出到屏幕上,你如果想保存,需要使用IO重定向的方式保存:
如:
sed
『s/home/home1』
1.txt
>2.txt
這樣做的原因是,如果你修改了原文件的話,你沒法使用word,vim,txt的undo功能撤銷修改,恢復原來的文件。所以,sed會將修改之後的文件輸出到屏幕,你看到修改滿意的話,再重定向到其他文件。就完成了修改。明白否?
-e是啟用多行命令
上述兩條編輯命令都是一行命令,所以看不出效果。

G. SED是什麼

SED

sed 是一個非互動式上下文(context)編輯器,它被設計在下列三種情況下發揮作用:

1) 編輯那些對舒適的互動式編輯而言太大的文件。
2) 在編輯命令太復雜而難於在交互模式下鍵入的時候編輯任何大小的文件。
3) 要在對輸入的一趟掃描中有效的進行多個『全局』(global)編輯函數。

因為每次只把輸入的某些行駐留在內存中,並且不使用臨時文件,所以可編輯的文件的有效大小,只受限於輸入和輸出要同時共存於次級存儲的要求。

可以單獨的建立復雜的編輯腳本並作為給 sed 的命令文件。對於復雜的編輯,這節省了可觀的鍵入和隨之而來的錯誤。從命令文件運行 sed 高效於作者所知道的任何互動式編輯器,甚至包括能用預先寫好的腳本驅動的編輯器。

相較於互動式編輯器而言,根本性的損失是缺乏相對地址(由於操作是每次一行的),和缺乏對命令如期運行的立即驗證。

sed 是 UNIX 編輯器 ed 的直系後代。由於在互動式和非互動式操作之間的差異,在 ed 和 sed 之間已經有了可觀的變化;甚至 ed 的慣常用戶都會經常感到驚訝(並可能氣憤),如果他們沒有閱讀本文檔的章節 2 和 3,就草率的使用 sed 的話。在兩個編輯器之間最顯著的家族性共同之處,在於他們所識別的模式(『正則表達式』)的種類;匹配模式的代碼可以從 ed 的代碼幾乎原封不動的復制過來,在章節 2 中對正則表達式的描述就是從 UNIX Programmer』s Manual[1] 幾乎原封不動的復制過來的。(代碼和描述都是 Dennis M. Ritchie 寫的)。

H. 一句話解釋,sed命令是做什麼的

命令:
a\在當前行後面加入一行文本。
b label分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
c\用新的文本改變本行的文本。
d 從模板塊位置刪除行。
D 刪除模板塊的第一行。
i\在當前行上面插入文本。
h拷貝模板塊的內容到內存中的緩沖區。
H 追加模板塊的內容到內存中的緩沖區。
g 獲得內存緩沖區的內容,並替代當前模板塊中的文本。
G 獲得內存緩沖區的內容,並追加到當前模板塊文本的後面。
l 列表不能列印字元的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼。
p 列印模板塊的行。
P 列印模板塊的第一行。
q 退出Sed。
r file從file中讀行。
t labelif分支,從最後一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
T label錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
w file寫並追加模板塊到file末尾。
W file寫並追加模板塊的第一行到file末尾。

I. Linux中的sed是什麼意思呢,如何使用呢

sed命令行格式為:
sed [-nefri] 『command』 輸入文本/文件

常用選項:
-n∶取消默認的輸出,使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到屏幕上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來
-e∶進行多項編輯,即對輸入行應用多條sed命令時使用. 直接在指令列模式上進行 sed 的動作編輯
-f∶指定sed腳本的文件名. 直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作
-r∶sed 的動作支援的是延伸型正則表達式的語法。(預設是基礎正則表達式語法)
-i∶直接修改讀取的文件內容,而不是由屏幕輸出
常用命令:
a ∶ 新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
c ∶ 取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行
d ∶ 刪除,因為是刪除,所以 d 後面通常不接任何內容
i ∶ 插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行)
p∶ 列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起用
s∶ 取代,可以直接進行替換的工作。通常這個 s 的動作可以搭配正則表達式。例如 1,20s/old/new/g

定址
定址用於決定對哪些行進行編輯。地址的形式可以是數字、正則表達式、或二者的結合。如果沒有指定地址,sed將處理輸入文件的所有行。
地址是一個數字,則表示行號;是「$"符號,則表示最後一行。例如:

sed -n '3p' datafile
只列印第三行

只顯示指定行范圍的文件內容,例如:
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log
地址是逗號分隔的,那麼需要處理的地址是這兩行之間的范圍(包括這兩行在內)。范圍可以用數字、正則表達式、或二者的組合表示。例如:

sed '2,5d' datafile
#刪除第二到第五行
sed '/My/,/You/d' datafile
#刪除包含"My"的行到包含"You"的行之間的行
sed '/My/,10d' datafile
#刪除包含"My"的行到第十行的內容

舉例:(假設我們有一文件名為ab)
刪除某行
[root@localhost ruby] # sed '1d' ab #刪除第一行
[root@localhost ruby] # sed '$d' ab #刪除最後一行
[root@localhost ruby] # sed '1,2d' ab #刪除第一行到第二行
[root@localhost ruby] # sed '2,$d' ab #刪除第二行到最後一行
顯示某行
. [root@localhost ruby] # sed -n '1p' ab #顯示第一行
[root@localhost ruby] # sed -n '$p' ab #顯示最後一行
[root@localhost ruby] # sed -n '1,2p' ab #顯示第一行到第二行
[root@localhost ruby] # sed -n '2,$p' ab #顯示第二行到最後一行
使用模式進行查詢
[root@localhost ruby] # sed -n '/ruby/p' ab #查詢包括關鍵字ruby所在所有行
[root@localhost ruby] # sed -n '/\$/p' ab #查詢包括關鍵字$所在所有行,使用反斜線\屏蔽特殊含義
增加一行或多行字元串
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第一行後增加字元串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行後增加字元串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行後增加多行,使用換行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
代替一行或多行
[root@localhost ruby] # sed '1c Hi' ab #第一行代替為Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替為Hi
Hi
end
替換一行中的某部分
格式:sed 's/要替換的字元串/新的字元串/g' (要替換的字元串可以用正則表達式)
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替換ruby為bird
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #刪除ruby
插入
[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最後一行直接輸入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye

替換:
-e是編輯命令,用於sed執行多個編輯任務的情況下。在下一行開始編輯前,所有的編輯動作將應用到模式緩沖區中的行上。
sed -e '1,10d' -e 's/My/Your/g' datafile
#選項-e用於進行多重編輯。第一重編輯刪除第1-3行。第二重編輯將出現的所有My替換為Your。因為是逐行進行這兩項編輯(即這兩個命令都在模式空間的當前行上執行),所以編輯命令的順序會影響結果。

# 替換兩個或多個空格為一個空格

sed 's/[ ][ ]*/ /g' file_name

# 替換兩個或多個空格為分隔符:

sed 's/[ ][ ]*/:/g' file_name

# 如果空格與tab共存時用下面的命令進行替換

# 替換成空格

sed 's/[[:space:]][[:space:]]*/ /g' filename

# 替換成分隔符:

sed 's/[[:space:]][[:space:]]*/:/g' filename

==============

sed命令的調用:
在命令行鍵入命令;將sed命令插入腳本文件,然後調用sed;將sed命令插入腳本文件,並使sed腳本可執行
sed [option] sed命令 輸入文件 在命令行使用sed命令,實際命令要加單引號
sed [option] -f sed腳本文件 輸入文件 使用sed腳本文件
sed腳本文件 [option] 輸入文件 第一行具有sed命令解釋器的sed腳本文件
option如下:
n 不列印; sed不寫編輯行到標准輸出,預設為列印所有行(編輯和未編輯),p命令可以用來列印編輯行
c 下一命令是編輯命令,使用多項編輯時加入此選項
f 如果正在調用sed腳本文件,使用此選項,此選項通知sed一個腳本文件支持所用的sed命令,如
sed -f myscript.sed input_file 這里myscript.sed即為支持sed命令的文件
使用重定向文件即可保存sed的輸出
使用sed在文本中定位文本的方式:
x x為一行號,比如1
x,y 表示行號范圍從x到y,如2,5表示從第2行到第5行
/pattern/ 查詢包含模式的行,如/disk/或/[a-z]/
/pattern/pattern/ 查詢包含兩個模式的行,如/disk/disks/
/pattern/,x 在給定行號上查詢包含模式的行,如/disk/,3
x,/pattern/ 通過行號和模式查詢匹配行,如 3,/disk/
x,y! 查詢不包含指定行號x和y的行
基本sed編輯命令:
p 列印匹配行 c/ 用新文本替換定位文本
= 顯示文件行號 s 使用替換模式替換相應模式
a/ 在定位行號後附加新文本信息 r 從另一個文本中讀文本
i/ 在定位行號後插入新文本信息 w 寫文本到一個文件
d 刪除定位行 q 第一個模式匹配完成後退出或立即退出
l 顯示與八進制ASCII代碼等價的控制字元 y 傳送字元
n 從另一個文本中讀文本下一行,並附加在下一行 {} 在定位行執行的命令組
g 將模式2粘貼到/pattern n/
基本sed編程舉例:
使用p(rint)顯示行: sed -n '2p' temp.txt 只顯示第2行,使用選項n
列印范圍: sed -n '1,3p' temp.txt 列印第1行到第3行
列印模式: sed -n '/movie/'p temp.txt 列印含movie的行
使用模式和行號查詢: sed -n '3,/movie/'p temp.txt 只在第3行查找movie並列印
顯示整個文件: sed -n '1,$'p temp.txt $為最後一行
任意字元: sed -n '/.*ing/'p temp.txt 注意是.*ing,而不是*ing
列印行號: sed -e '/music/=' temp.txt
附加文本:(創建sed腳本文件)chmod u+x script.sed,運行時./script.sed temp.txt
#!/bin/sed -f
/name1/ a/ #a/表示此處換行添加文本
HERE ADD NEW LINE. #添加的文本內容
插入文本: /name1/ a/ 改成 4 i/ 4表示行號,i插入
修改文本: /name1/ a/ 改成 /name1/ c/ 將修改整行,c修改
刪除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt
替換文本: sed 's/source/OKSTR/' temp.txt 將source替換成OKSTR
sed 's//$//g' temp.txt 將文本中所有的$符號全部刪除
sed 's/source/OKSTR/w temp2.txt' temp.txt 將替換後的記錄寫入文件temp2.txt
替換修改字元串: sed 's/source/"ADD BEFORE" &/p' temp.txt
結果將在source字元串前面加上"ADD BEFORE",這里的&表示找到的source字元並保存
sed結果寫入到文件: sed '1,2 w temp2.txt' temp.txt
sed '/name/ w temp2.txt' temp.txt
從文件中讀文本: sed '/name/r temp2.txt' temp.txt
在每列最後加文本: sed 's/[0-9]*/& Pass/g' temp.txt
從shell向sed傳值: echo $NAME | sed "s/go/$REP/g" 注意需要使用雙引號
快速一行命令:
's//.$//g' 刪除以句點結尾行
'-e /abcd/d' 刪除包含abcd的行
's/[][][]*/[]/g' 刪除一個以上空格,用一個空格代替
's/^[][]*//g' 刪除行首空格
's//.[][]*/[]/g' 刪除句號後跟兩個或更多的空格,用一個空格代替
'/^$/d' 刪除空行
's/^.//g' 刪除第一個字元,區別 's//.//g'刪除所有的句點
's/COL/(.../)//g' 刪除緊跟COL的後三個字母
's/^////g' 刪除路徑中第一個/
///////////////////////////////////////////////////////////////////////
、使用句點匹配單字元 句點「.」可以匹配任意單字元。「.」可以匹配字元串頭,也可以是中間任意字元。假定正在過濾一個文本文件,對於一個有1 0個字元的腳本集,要求前4個字元之後為X C,匹配操作如下:. . . .X C. . . .
2、在行首以^匹配字元串或字元序列 ^只允許在一行的開始匹配字元或單詞。在行首第4個字元為1,匹配操作表示為:^ . . . 1
3、在行尾以$匹配字元串或字元 可以說$與^正相反,它在行尾匹配字元串或字元, $符號放在匹配單詞後。如果在行尾匹配單詞j e t 0 1,操作如下:j e t 0 1 $ 如果只返回包含一個字元的行,操作如下:^ . $
4、使用*匹配字元串中的單字元或其重復序列 使用此特殊字元匹配任意字元或字元串的重復多次表達式。
5、使用/屏蔽一個特殊字元的含義 有時需要查找一些字元或字元串,而它們包含了系統指定為特殊字元的一個字元。如果要在正則表達式中匹配以* . p a s結尾的所有文件,可做如下操作:/ * / . p a s
6、使用[]匹配一個范圍或集合 使用[ ]匹配特定字元串或字元串集,可以用逗號將括弧內要匹配的不同字元串分開,但並不強制要求這樣做(一些系統提倡在復雜的表達式中使用逗號),這樣做可以增 加模式的可讀性。使用「 -」表示一個字元串范圍,表明字元串范圍從「 -」左邊字元開始,到「 -」右邊字元結束。假定要匹配任意一個數字,可以使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,則使用:[ A - Z a - z ]表明從A - Z、a - z的字母範圍。
7、使用/{/}匹配模式結果出現的次數 使用*可匹配所有匹配結果任意次,但如果只要指定次數,就應使用/ { / },此模式有三種形式,即:
pattern/{n/} 匹配模式出現n次。
pattern/{n,/} 匹配模式出現最少n次。
pattern/{n,m} 匹配模式出現n到m次之間,n , m為0 - 2 5 5中任意整數。
匹配字母A出現兩次,並以B結尾,操作如下:A / { 2 / } B匹配值為A A B 匹配A至少4次,使用:A / { 4 , / } B

===============
替換單引號為空:
可以這樣寫:
sed 's/'"'"'//g'

sed 's/'\''//g'

J. linux命令sed與awk是干什麼用的,怎麼用

sed 可理解為 stream editor 的簡稱,即文本流編輯器。以行為單位處理文本,可以做插入行、刪除行、行內文本替換等操作。
awk 中存在 記錄 和 欄位 兩個關鍵概念,通常默認一行就是一個記錄,一個記錄又可以被指定分隔符(默認是空格或tab)分割為多個欄位。因此awk更為靈活與強大(並且有很多內置函數和變數可使用)。
關於具體用法,太多了。強大的東西總不是三言兩語能夠說盡的。網上有很多教程可以看,例如:
Sed - An Introction and Tutorial.doc
Awk - An Introction and Tutorial.doc

閱讀全文

與命令行sed是什麼意思相關的資料

熱點內容
s型命令 瀏覽:23
php年薪5年 瀏覽:67
如何上網上設個人加密賬戶 瀏覽:44
linux打開ssh服務 瀏覽:78
微信位置可以加密嗎 瀏覽:470
演算法蠻力法 瀏覽:438
隨機排練命令 瀏覽:147
python多進程並發 瀏覽:41
安卓軟體安裝如何躲避安全檢測 瀏覽:647
奇幻潮翡翠台源碼百度雲盤 瀏覽:187
什麼軟體可以免費pdf轉word 瀏覽:15
php正則表達式大全 瀏覽:394
androidntp時間 瀏覽:299
輪機長命令簿英文 瀏覽:148
oppo鈴聲設置被加密怎麼處理 瀏覽:548
粵苗app圖形驗證碼怎麼填 瀏覽:899
管家婆架設雲伺服器 瀏覽:254
php的登錄界面代碼 瀏覽:997
php開發客戶端 瀏覽:998
theisle測試服怎麼搜伺服器 瀏覽:447