<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
sed 是一個比較古老的,功能十分強大的用於文書處理的流編輯器,加上正規表示式的支援,可以進行大量的複雜的文字編輯操作。sed 本身是一個非常複雜的工具,有專門的書籍講解 sed 的具體用法,但是個人覺得沒有必要去學習它的每個細節,那樣沒有特別大的實際意義。網上也有很多關於 sed 的教學,我也是抱著學習的心態來學習 sed 的常見的用法,並進行系統的總結,內容基本覆蓋了 sed 的大部分的知識點。文中的內容比較簡練,加以實際範例來幫助去理解 sed 的使用。
sed 全名為 stream editor,流編輯器,用程式的方式來編輯文字,功能相當的強大。是貝爾實驗室的 Lee E.McMahon 在 1973 年到 1974 年之間開發完成,目前可以在大多數作業系統中使用,sed 的出現作為 grep 的繼任者。與vim等編輯器不同,sed 是一種非互動式編輯器(即使用者不必參與編輯過程),它使用預先設定好的編輯指令對輸入的文字進行編輯,完成之後再輸出編輯結構。sed 基本上就是在玩正則模式匹配,所以,玩sed的人,正規表示式一般都比較強。
sed會一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,成為"模式空間",接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重定向儲存輸出。
在編寫處理字串的程式或網頁時,經常會有查詢符合某些複雜規則的字串的需要。正規表示式就是用於描述這些規則的工具,換句話說,正規表示式就是記錄文字規則的程式碼。許多程式設計語言都支援利用正規表示式進行字串操作。在很多文字編輯器裡,正規表示式通常被用來檢索、替換那些符合某個模式的文字。
簡單描述一下正規表示式的匹配過程,就是拿正規表示式所表示的字串去和原文字串內容去匹配,直到匹配到原文內容字串中的一個完整子串就表示匹配成功。舉個例子,有一行檔案內容"this is better desk",這裡用"esk"去匹配,匹配過程是這樣的:首先拿e去匹配檔案行內容,從this開始,直到better的e,第一個字元匹配成功,接著s去匹配better字元e後邊的t字元,沒有匹配成功;然後重新拿esk中的e去和better的第二個t去匹配,沒有成功,接著原始內容的下一個字元,直到desk中的e字元,逐個匹配s,k字元,到此為止,esk成功匹配,正規表示式匹配完畢,整個過程就是這樣,即使再複雜的正規表示式的匹配過程也是按照此過程來進行的。
[root@www ~]# sed [-nefr] [動作]
選項與引數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到終端上。但如果加上 -n 引數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的 sed 動作;
-r :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-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 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!
sed -i 就是直接對文字檔案進行操作的
sed -i 's/原字串/新字串/' /home/1.txt
sed -i 's/原字串/新字串/g' /home/1.txt
這兩條命令的區別就是,看範例吧
這是1.txt的內容
#cat 1.txt
d
ddd
#ff
再看執行這兩條命令的區別吧
sed -i 's/d/7523/' /home/1.txt
執行結果
7523
7523dd
#ff
sed -i 's/d/7523/g' /home/1.txt
執行結果
7523
752375237523
#ff
去掉 “行首” 帶“@”的首字母@
sed -i 's/^@//' file
特定字串的行前插入新行
sed -i '/特定字串/i 新行字串' file
特定字串的行後插入新行
sed -i '/特定字串/a 新行字串' file
特定字串的刪除
sed -i '/字串/d' file
關於正規表示式的內容挺多的,掌握好下文中提及的內容就能滿足正常工作中的需要,如果是專門做正則程式設計的,可以去買本正規表示式的書籍來看好了^_^。只有多動手多練習,才是學開發程式設計的最好姿勢。
匹配任意一個字元,除了換行符,但是需要注意的是,在sed中不能匹配換行符,但是在awk中可以匹配換行符。類似shell萬用字元中的"?",匹配一個任意字元。
"*"表示前邊字元有0個或多個。".*"表示任意一個字元有0個或多個,也就是能匹配任意的字元。類似shell萬用字元中的"*",可以匹配任意字元。
"[ ]"中括號中可以包含表示字元集的表示式。使用方法大概有如下幾種。
[a-z]:表示a-z字元中的一個,也就是小寫字母。
[0-9]:表示0-9字元中的一個,也就是表示數位。
[A-Z]:表示大寫字母。
[a-zA-Z]:表示字元集為小寫字母或者大寫字母。
[a-zA-Z0-9]:表示普通字元,包括大小寫字母和數位。
[abc]:表示字元a或者字元b或者字元c。
[^0-9]:表示非數位型別的字元,^表示取反意思,只能放在中括號的開始處才有意義。
[-cz]:表示字元-或者字元c或者字元z,注意與[c-z]的區別,因為-符號沒有放在e和f之間。
"^"表示行首的意思,也就是每一行的開始位置。在這裡並不是上邊字元範圍中取反的意思,^符號只有在"[]"符號的開頭處才能表示字元取反。
^abc:表示以abc開頭的字串abc。
^abc.*:表示以abc開頭的字串abcxxx。
"$"表示行尾的意思,也就是每一行的結尾位置,很好理解,和"^"正好相反。
world$:表示以world結尾的字串world,如果該行中間有world字串是不符合匹配條件的。
^$:表示空行。行首和行尾沒有內容,可不就是空行嘛。
""表示是跳脫字元,和其它語言中用到的跳脫字元意義基本上是一樣的。其實簡單理解,就是把元字元跳脫為普通字元,比如"\"表示普通符號"",把普通字元轉換為特殊意義符號,比如"n"表示把普通字元n跳脫為換行符。
"{}"表示前邊字元的數量範圍,大概有三種用法,其實容易理解,看例子就知道了,但是必須注意要加上跳脫字元"",否則不生效,表示為普通字元"{"或"}"。
{2}:表示前邊字元的重複次數是2。
{2,}:表示前邊字元的重複次數至少是2,也就是大於等於2。
{2,9}:表示前邊字元的重複次數大於2但小於9。
"<"表示匹配條件為詞首的位置,理解上可以對比 "^" 行首。
舉個例子,"nihao 1hello 2hello3 hello4"有這麼內容的一行內容。
"<hello"匹配結果"nihao 1hello 2hello3 hello4";
"hello>"匹配結果"nihao 1hello 2hello3 hello4",這種匹配方式用的不是太多,用到會用就OK。
擴充套件正規表示式是在基本正規表示式中擴充套件出來的,內容不是很多,使用頻率上可能沒有基本正規表示式那麼高,但是擴充套件正則依然很重要,很多情況下沒有擴充套件正則是搞不定的。sed命令使用擴充套件正則需要加上選項-r。
"?":表示前置字元有0個或1個。
"+":表示前置字元有1個或多個。
"|":表示指明兩項之間的一個選擇。
abc|ABC:表示可以匹配abc或者ABC。
"()"表示分組,類似算數表示式中的()。子命令表示式中可以通過1,2,3等來表示分組匹配到的內容。其實"()"也可以在基本正規表示式中使用的。
(a|b)b:表示可以匹配ab或者bb字串
([0-9])|([0][0-9])|([1][0-9]):表示匹配0-9或者00-09或者10-19範圍的字元。
這裡的"{}"和基本正規表示式中的大括號意義是一樣的,只不過在使用時不用加""跳脫符號。
字元類
[Ww]hat .H[12345]
字元的範圍
[a-z] [0-9] [Cc]hapter[1-9] [-+*/] [0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]
排除字元類
[^0-9]
重複出現的字元
[15]0* [15]00
字元的跨度
*與{n,m}
電話號碼的匹配
[0-9]{3}-[0-9]{7,8}
分組操作
compan(y|ies)
sed [選項] ‘command’ 檔名稱
選項部分,常見選項包括-n,-e,-i,-f,-r選項。
command部分包括:[地址1,地址2] [函數] [引數(標記)]
選項-n
sed預設會把模式空間處理完畢後的內容輸出到標準輸出,也就是輸出到螢幕上,加上-n選項後被設定為安靜模式,也就是不會輸出預設列印資訊,除非子命令中特別指定列印選項,則只會把匹配修改的行進行列印。
例子1:
echo -e 'hello worldnnihao' | sed 's/hello/A/'
結果:
A world
nihao
例子2:
echo -e 'hello worldnnihao' | sed -n 's/hello/A/'
結果:加-n選項後什麼也沒有顯示。
例子3:
echo -e 'hello worldnnihao' | sed -n 's/hello/A/p'
結果:A world/
說明:-n選項後,再加p標記,只會把匹配並修改的內容列印了出來。
選項-e
如果需要用sed對文字內容進行多種操作,則需要執行多條子命令來進行操作。
例子1:
echo -e 'hello world' | sed -e 's/hello/A/' -e 's/world/B/'
結果:A B
例子2:
echo -e 'hello world' | sed 's/hello/A/;s/world/B/'
結果:A B
說明:例子1和例子2的寫法的作用完全等同,可以根據喜好來選擇,如果需要的子命令操作比較多的時候,無論是選擇-e選項方式,還是選擇分號的方式,都會使命令顯得臃腫不堪,此時使用-f選項來指定指令碼檔案來執行各種操作會比較清晰明瞭。
選項-i
sed預設會把輸入行讀取到模式空間,簡單理解就是一個記憶體緩衝區,sed子命令處理的內容是模式空間中的內容,而非直接處理檔案內容。因此在sed修改模式空間內容之後,並非直接寫入修改輸入檔案,而是列印輸出到標準輸出。如果需要修改輸入檔案,那麼就可以指定-i選項。
例子1:
cat file.txt
hello world
[root@localhost]# sed 's/hello/A/' file.txt
A world
[root@localhost]# cat file.txt
hello world
例子2:
[root@localhost]# sed -i 's/hello/A/' file.txt
[root@localhost]# cat file.txt
A world
例子3:
[root@localhost]# sed –i.bak 's/hello/A/' file.txt
說明:最後一個例子會把修改內容儲存到file.txt,同時會以file.txt.bak檔案備份原來未修改檔案內容,以確保原始檔案內容安全性,防止錯誤操作而無法恢復原來內容。
選項-f
還記得 -e 選項可以來執行多個子命令操作,用分號分隔多個命令操作也是可以的,如果命令操作比較多的時候就會比較麻煩,這時候把多個子命令操作寫入指令碼檔案,然後使用 -f 選項來指定該指令碼。
例子1:
echo "hello world" | sed -f sed.script
結果:A B
sed.script指令碼內容:
s/hello/A/
s/world/B/
說明:在指令碼檔案中的子命令串就不需要輸入單引號了。
選項-r
sed命令的匹配模式支援正規表示式的,預設只能支援基本正規表示式,如果需要支援擴充套件正規表示式,那麼需要新增-r選項。
例子1:
echo "hello world" | sed -r 's/(hello)|(world)/A/g'
A A
預設情況下sed會對每一行內容進行匹配、處理、輸出,某些情況不需要對處理的文字全部編輯,只需要其中的一部分,比如1-10行,偶數行,或者是包含"hello"字串的行,這種情況下就需要我們去定位特定的行來處理,而不是全部內容,這裡把這個定位指定的行叫做"定址"。
數位定址其實就是通過數位去指定具體要操作編輯的行,數位定址有幾種方式,每種方式都有不同的應用場景,下邊以舉例的方式來描述每種數位定址的用法。
例子1:
sed –n ‘4s/hello/A/’ message
說明:將第4行中hello字串替換為A,其它行如果有hello也不會被替換。
例子2:
sed –n ‘2,4s/hello/A/’ message
說明:將第2-4行中hello字串替換為A,其它行如果有hello也不會被替換。
例子3:
sed –n ‘2,+4s/hello/A/’ message
說明:從第2行開始,再接著往下數4行,也就是2-6行,這些行會把hello字元替換為A。
例子4:
sed –n ‘4,~3s/hello/A/’ message
說明:第4行開始,到第6行。解釋6的由來,"4,~3"表示從4行開始到下一個3的倍數,這裡從4開始算,那就是6了,當然9就不是了,因為是要求3的第一個超過前邊數位4的倍數,感覺這種適用場景不會太多。
例子5:
sed –n ‘4~3s/hello/A/’ message
說明:從第4行開始,每隔3行就把hello替換為A。比如從4行開始,7行,10行等依次+3行。這個比較常用,比如3替換為2的時候,也就是每隔2行的步調,可以實現奇數和偶數行的操作。
例子6:
sed –n ‘$s/hello/A/’ message
說明:$符號表示最後一行,和正則中的$符號類似,但是第1行不用^表示,直接1就行了。
例子7:
sed -n ‘1!s/hello/A/’ message
說明:!符號表示取反,該命令是將除了第1行,其它行hello替換為A,上述定址方式也可以使用!符號。
正則定址使用目的和數位定址完全一樣,使用方式上有所不同,是通過正規表示式的匹配來確定需要處理編輯哪些行,其它行就不需要額外處理。
例子1:
sed -n ‘/nihao/d’ message
說明:將匹配到nihao的行執行刪除操作。
例子2:
sed -n ‘/^$/d’ message
說明:刪除空行
例子3:
sed -n ‘/^TS/,/^TE/d’ message
說明:匹配以TS開頭的行到TE開頭的行之間的行,把匹配到的這些行刪除。
其實數位定址和正則定址可以配合使用,參考下邊的例子。
例子1:
sed -n ‘1,/^TS/d’ message
說明:匹配從第1行到TS開頭的行,把匹配的行刪除。
例子1:
/^TS/,/^TE/{
s/CN/China/
s/Beijing/BJ/
}
說明:該命令表示將從TS開頭的行到TE開頭的行之間範圍的行內容中CN替換為China,並且把Beijing替換為BJ,類似於多命令之間用分號的那種方式,不過這樣定址程式碼只寫了一遍,相當於執行了一條子命令。
例子2:
sed -n ‘2,3s{/cn/china/;/a/b/}’ message
說明:效果類似例子1,有點數學上的乘法分配率的意思。
sed 預設的命令執行範圍是全域性編輯的,如果不明確指定行的話,命令會在所有輸入行上執行,如果想僅對其中部分行執行命令,可以使用地址限制。如果給了 2 個地址,即地址對(地址範圍),則命令匹配的這個地址範圍內執行,但是需要注意的是:對於像 "addr1,addr2" 這種形式的地址匹配,如果addr1 匹配,則匹配成功,"開關"開啟,在該行上執行命令,此時不管 addr2 是否匹配,即使 addr2 在 addr1 這一行之前;接下來讀入下一行,如果addr2 匹配,則執行命令,同樣開關"關閉";如果 addr2 在 addr1 之後,則一直處理到匹配為止,換句話說,如果 addr2 一直不匹配,則開關一直不關閉,因此會持續執行命令到最後一行。
子命令a表示在指定行下邊插入指定行的內容。
例子1:
sed ‘a A’ message
說明:將message檔案中每一行下邊都插入新增一行內容是A。
例子2:
sed ‘1,2a A’ message
說明:將message檔案中1-2行的下邊插入新增一行內容是A
例子3:
sed ‘1,2a AnBnC’ message
說明:將message檔案中1-2行的下邊分別新增3行,3行內容分別是A、B、C,這裡使用了n,插入多行內容都可以按照這種方式來實現。
子命令i和a使用上基本上一樣,只不過是在指定行上邊插入指定行的內容。
例子1:
sed ‘i A’ message
說明:將message檔案中每一行上邊都插入新增一行內容是A。
例子2:
sed ‘1,2i A’ message
說明:將message檔案中1-2行的上邊插入新增一行內容是A
例子3:
sed ‘1,2i AnBnC’ message
說明:將message檔案中1-2行的上邊分別新增3行,3行內容分別是A、B、C,這裡使用了n,插入多行內容都可以按照這種方式來實現。
子命令c是表示把指定的行內容替換為自己需要的行內容。
例子1:
sed ‘c A’ message
說明:將message檔案中所有的行內容都分別替換為A行內容。
例子2:
sed ‘1,2c A’ message
說明:將message檔案中1-2行的內容替換為A,注意這裡說的是將1-2行所有的內容只替換為一個A內容,也就是1-2行內容程式設計了一行,定址如果連續就是這種情況。如果想把1-2行分別替換為A,可以參考下個例子的方式。
例子3:
sed ‘1,2c AnA’ message
說明:將message中1-2行內容分別替換為了A,需要在替換內容上手動加換行n,這樣當然也可以將一行內容替換為多行內容。
子命令d表示刪除指定的行內容,比較簡單,更容易理解。
例子1:
sed ‘d’ message
說明:將message所有行全部刪除,因為沒有加定址表示式,所以平時如果需要刪除指定行內容,需要在子命令前加定址表示式。
例子2:
sed ‘1,3d’ message
說明:將message檔案中1-3行內容刪除。
子命令y表示字元替換,可以替換多個字元,只能替換字元不能替換字串,且不支援正規表示式,具體使用方法看例子。
例子1:
sed ‘y/ab/AB/’ message
說明:把message中所有a字元替換為A符號,所有b字元替換為B符號。
強調一下,這裡的替換源字元個數和目的字元個數必須相等;字元不支援正規表示式;源字元和目標字元每個字元需要一一對應。
子命令=,可以將行號列印出來。
例子:
sed ‘1,2=’ message
結果:
1
nihao
2
hello world
說明:將指定行的上邊顯示行號。
子命令r,類似於a,也是將內容追加到指定行的後邊,只不過r是將指定檔案內容讀取並追加到指定行下邊。
例子1:
sed ‘2r a.txt’ message
說明:將a.txt檔案內容讀取並插入到message檔案第2行的下邊。
子命令s為替換子命令,是平時sed使用的最多的子命令,沒有之一。因為支援正規表示式,功能變得強大無比,下邊來詳細地說說子命令s的使用方法。
基本語法:
[address]s/pattern/replacement/flags
s字串替換,替換的時候可以把/換成其它的符號,比如=,replacement部分用下列字元會有特殊含義:
>>> &:用正規表示式匹配的內容進行替換
>>> n:回撥引數
>>> ():儲存被匹配的字元以備反向參照n時使用,最多9個標籤,標籤書序從左到右
Flags
>>> n:可以是1-512,表示第n次出現的情況進行替換
>>> g:全域性更改
>>> p:列印模式空間的內容
>>> w file:寫入到一個檔案file中
測試檔案:
# cat message
hello 123 world
例子1:
sed ‘s/hello/HELLO/’ message
說明:將message每行包含的第一個hello的字串替換為HELLO,這是最基本的用法。
例子2:
sed -r ‘s/[a-z]+ [0-9]+ [a-z]+/A/’ message
結果:A
說明:使用了擴充套件正規表示式,需要加-r選項。
例子3:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/123/’ message
結果:hello 123 world
說明:再看下一個例子就明白了。
例子4:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/321/’ message
結果:world 123 hello
說明:1表示正則第一個分組結果,2表示正則匹配第二個分組結果,3表示正則匹配第三個分組結果。
例子5:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/&/’ message
結果:hello 123 world
說明:&表示正規表示式匹配的整個結果集。
例子6:
sed -r ‘s/([a-z]+)( [0-9]+ )([a-z]+)/111&222/’ message
結果:111hello 123 world222
說明:在匹配結果前後分別加了111、222。
例子7:
sed -r ‘s/.*/111&222/’ message
說明:在message檔案中每行的首尾分別加上111、222。
例子8:
sed ‘s/i/A/g’ message
說明:把message檔案中每行的所有i字元替換為A,預設不加g標記時只替換每行的第一個字元。
例子9:
sed ‘s/i/A/2’ message
說明:把message檔案中每行的第2個i字元替換為A。
例子10:
sed -n ‘s/i/A/p’ message
說明:加-p標記會把被替換的行列印出來,再加上-n選項會關閉模式空間列印模式,因此該命令的效果就是隻顯示被替換修改的行。
例子11:
sed -n ‘s/i/A/w b.txt’ message
說明:把message檔案中內容的每行第一個字元i替換為A,然後把修改內容另存為b.txt檔案。
例子12:
sed -n ‘s/i/A/i’ message
說明:把message檔案中每一行的第一個i或I字元替換為A字元,也即是忽略大小寫。
模式空間初始化為空,處理完一行後會自動輸出到螢幕並清除模式空間;保持空間初始化為一個空行,也就是預設帶一個n,處理完後不會自動清除。模式空間和保持空間,從程式的角度去看,其實就是sed在工作的時候佔用了一些記憶體空間和地址,sed工作完畢就會把記憶體釋放並歸還給作業系統。
大概簡單描述一下sed的工作流程,讀取檔案的一行,存入模式空間,然後進行所有子命令的處理,處理完後預設會將模式空間的內容輸出列印到標準輸出,也就是在螢幕上顯示出來,接著清空模式空間的記憶體,繼續讀取下一行的內容到模式空間,繼續處理,依次迴圈處理。
h:把模式空間內容覆蓋到保持空間中
H:把模式空間內容追加到保持空間中
g:把保持空間內容覆蓋到模式空間中
G:把保持空間內容追加到模式空間中
x:交換模式空間與保持空間的內容
測試檔案:
# cat test.txt
11111
22222
33333
44444
例子1:
sed ‘{1h;2,3H;4G}’ test.txt
結果:
11111
22222
33333
44444
11111
22222
33333
解釋說明:略。懶得寫了。
例子2:
sed ‘{1h;2x;3g;$G}’ test.txt
結果:
11111
11111
22222
44444
22222
解釋說明:略。
例子3:
sed ‘{1!G;h;$!d}’ test.txt
結果:
44444
33333
22222
11111
高階子命令比較少,但是比較複雜,平時用的也會相對少些,卻也很重要,有的內容處理不用高階子命令是完成不了的。
n:讀入下一行到模式空間,例:’4{n;d}’ 刪除第5行。
N:追加下一行到模式空間,再把當前行和下一行同時應用後面的命令。
P:輸出多行模式空間的第一部分,直到第一個嵌入的換行符位置。在執行完指令碼的最後一個命令之後,模式空間的內容自動輸出。P命令經常出現在N命令之後和D命令之前。
D:刪除模式空間中第一個換行符的內容。它不會導致讀入新的輸入行,相反,它返回到指令碼的頂端,將這些指令應用與模式空間剩餘的內容。這3個命令能建立一個輸入、輸出迴圈,用來維護兩行模式空間,但是一次只輸出一行。
例子1:
sed ‘N;$!P;D’ a.txt
#說明:刪除檔案倒數第二行
例子2:
sed ‘N;$!P;$!D;$d’ a.txt
# 說明:刪除檔案最後兩行
分支命令用於無條件轉移,測試命令用於有條件轉移。
跳轉的位置與標籤相關聯。
如果有標籤則跳轉到標籤所在的後面行繼續執行。
如果沒有標籤則跳轉到指令碼的結尾處。
標籤:以冒號開始後接標籤名,不要在標籤名前後使用空格。
測試檔案:
grep seker /etc/passwd
seker:x:500:500::/home/seker:/bin/bash
例子1:
grep seker /etc/passwd | sed ‘:top;s/seker/blues/;/seker/b top;s/5/555/’
結果:blues:x:55500:500::/home/blues:/bin/bash
選擇執行
例子2:
grep ‘seker’ /etc/passwd | sed ‘s/seker/blues/;/seker/b end;s/5/555/;:end;s/5/666/’
結果:blues:x:66600:500::/home/seker:/bin/bash
測試命令,如果前一個替換命令執行成功則跳轉到指令碼末尾(case結構)
例子3:
grep ‘seker’ /etc/passwd | sed ‘s/seker/ABC;t;s/home/DEF/;t;s/bash/XYZ/’
結果:ABC:x:500:500::/home/seker:/bin/bash
例子4:
grep ‘zorro’ /etc/passwd | sed ‘s/seker/ABC/;t;s/home/DEF/;t;s/bash/XYZ’
結果:zorro:x:500:500::/DEF/zorro:/bin/bash
與標籤關聯,跳轉到標籤位置。
例子5:
grep ‘seker’ /etc/passwd | sed ‘s/seker/ABC/;t end;s/home/DEF/;t;end;s/bash/XYZ’
結果:ABC:x:500:500::/home/seker:/bin/XYZ
範例1:刪除檔案每行的第二個字元。
sed -r 's/(.*)(.)$/1/'
範例2:刪除檔案每行的最後一個字元。
sed -r 's/(.*)(.)$/1/'
範例3:刪除檔案每行的倒數第2個單詞。
sed -r ‘s/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*$)/1245/’ /etc/passwd
範例4:交換每行的第一個字元和第二個字元。
sed -r ‘s/(.)(.)(.*)/213/’ /etc/passwd
範例5:交換每行的第一個單詞和最後一個單詞。
sed -r ‘s/([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)([^a-Z]*$)/523416/’ /etc/passwd
範例6:刪除一個檔案中所有的數位。
sed ‘s/[0-9]//g’ /etc/passwd
範例7:用製表符替換檔案中出現的所有空格。
sed -r ‘s/ +/t/g’ /etc/passwd
範例8:把所有大寫字母用括號()括起來。
sed -r ‘s/([A-Z])/(1)/g’ /etc/passwd
範例9:列印每行3次。
sed ‘p;p’ /etc/passwd
範例10:隔行刪除
sed ‘0~2{=;d}’ /etc/passwd
範例11:把檔案從第22行到第33行復制到56行後面。
sed ‘22h;23,33H;56G’ /etc/passwd
範例12:把檔案從第22行到第33行移動到第56行後面。
sed ‘22{h;d};23,33{H;d};56g’ /etc/passwd
範例13:只顯示每行的第一個單詞。
sed -r ‘s/([a-Z]+)([^a-Z]+)(.*)/1/’ /etc/passwd
範例14:列印每行的第一個單詞和第三個單詞。
sed -r ‘s/([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)(.*)/1t5/’ /etc/passwd
範例15:將格式為mm/yy/dd的日期格式換成 mm;yy;dd
date '+%m/%y/%d' | sed 's///;/g'
到此這篇關於詳解sed -i 命令入門教學的文章就介紹到這了,更多相關sed -i 命令入門內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45