中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sed?-i命令怎么使用

發布時間:2022-06-23 09:41:08 來源:億速云 閱讀:2731 作者:iii 欄目:開發技術

這篇文章主要介紹了sed -i命令怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇sed -i命令怎么使用文章都會有所收獲,下面我們一起來看看吧。

一、簡介

1、sed介紹

 sed 全名為 stream editor,流編輯器,用程序的方式來編輯文本,功能相當的強大。是貝爾實驗室的 Lee E.McMahon 在 1973 年到 1974 年之間開發完成,目前可以在大多數操作系統中使用,sed 的出現作為 grep 的繼任者。與vim等編輯器不同,sed 是一種非交互式編輯器(即用戶不必參與編輯過程),它使用預先設定好的編輯指令對輸入的文本進行編輯,完成之后再輸出編輯結構。sed 基本上就是在玩正則模式匹配,所以,玩sed的人,正則表達式一般都比較強。

2、sed工作原理

sed會一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,成為"模式空間",接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。

3、正則表達式概念

在編寫處理字符串的程序或網頁時,經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用于描述這些規則的工具,換句話說,正則表達式就是記錄文本規則的代碼。許多程序設計語言都支持利用正則表達式進行字符串操作。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。

4、正則表達式的匹配過程

簡單描述一下正則表達式的匹配過程,就是拿正則表達式所表示的字符串去和原文字符串內容去匹配,直到匹配到原文內容字符串中的一個完整子串就表示匹配成功。舉個例子,有一行文件內容"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

二、基本正則表達式

關于正則表達式的內容挺多的,掌握好下文中提及的內容就能滿足正常工作中的需要,如果是專門做正則編程的,可以去買本正則表達式的書籍來看好了^_^。只有多動手多練習,才是學開發編程的最好姿勢。

1. 符號"."

匹配任意一個字符,除了換行符,但是需要注意的是,在sed中不能匹配換行符,但是在awk中可以匹配換行符。類似shell通配符中的"?",匹配一個任意字符。

2. 符號"*"

"*"表示前邊字符有0個或多個。".*"表示任意一個字符有0個或多個,也就是能匹配任意的字符。類似shell通配符中的"*",可以匹配任意字符。

3. 符號"[]"

"[ ]"中括號中可以包含表示字符集的表達式。使用方法大概有如下幾種。
[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之間。

4. 符號"^"

"^"表示行首的意思,也就是每一行的開始位置。在這里并不是上邊字符范圍中取反的意思,^符號只有在"[]"符號的開頭處才能表示字符取反。

^abc:表示以abc開頭的字符串abc。
^abc.*:表示以abc開頭的字符串abcxxx。

5. 符號"$"

"$"表示行尾的意思,也就是每一行的結尾位置,很好理解,和"^"正好相反。

world$:表示以world結尾的字符串world,如果該行中間有world字符串是不符合匹配條件的。
^$:表示空行。行首和行尾沒有內容,可不就是空行嘛。

6. 符號"\"

"\"表示是轉義字符,和其它語言中用到的轉義字符意義基本上是一樣的。其實簡單理解,就是把元字符轉義為普通字符,比如"\\"表示普通符號"\",把普通字符轉換為特殊意義符號,比如"\n"表示把普通字符n轉義為換行符。

7. 符號"{}"

"{}"表示前邊字符的數量范圍,大概有三種用法,其實容易理解,看例子就知道了,但是必須注意要加上轉義字符"\",否則不生效,表示為普通字符"{"或"}"。

\{2\}:表示前邊字符的重復次數是2。
\{2,\}:表示前邊字符的重復次數至少是2,也就是大于等于2。
\{2,9\}:表示前邊字符的重復次數大于2但小于9。

8. 符號"\<"和"\>"

"\<"表示匹配條件為詞首的位置,理解上可以對比 "^" 行首。
舉個例子,"nihao 1hello 2hello3 hello4"有這么內容的一行內容。
"\<hello"匹配結果"nihao 1hello 2hello3 hello4";
"hello\>"匹配結果"nihao 1hello 2hello3 hello4",這種匹配方式用的不是太多,用到會用就OK。

三、擴展正則表達式

擴展正則表達式是在基本正則表達式中擴展出來的,內容不是很多,使用頻率上可能沒有基本正則表達式那么高,但是擴展正則依然很重要,很多情況下沒有擴展正則是搞不定的。sed命令使用擴展正則需要加上選項-r。

1. 符號"?"

"?":表示前置字符有0個或1個。

2. 符號"+"

"+":表示前置字符有1個或多個。

3. 符號"|"

"|":表示指明兩項之間的一個選擇。
abc|ABC:表示可以匹配abc或者ABC。

4. 符號"()"

"()"表示分組,類似算數表達式中的()。子命令表達式中可以通過\1,\2,\3等來表示分組匹配到的內容。其實"()"也可以在基本正則表達式中使用的。

(a|b)b:表示可以匹配ab或者bb字串
([0-9])|([0][0-9])|([1][0-9]):表示匹配0-9或者00-09或者10-19范圍的字符。

5. 符號"{}"

這里的"{}"和基本正則表達式中的大括號意義是一樣的,只不過在使用時不用加"\"轉義符號。

四、正則表達式的分類和應用

字符類
[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語法和常用選項

1、語法

sed [選項] &lsquo;command&rsquo; 文件名稱
選項部分,常見選項包括-n,-e,-i,-f,-r選項。
command部分包括:[地址1,地址2] [函數] [參數(標記)]

2、常用選項

選項-n

sed默認會把模式空間處理完畢后的內容輸出到標準輸出,也就是輸出到屏幕上,加上-n選項后被設定為安靜模式,也就是不會輸出默認打印信息,除非子命令中特別指定打印選項,則只會把匹配修改的行進行打印。

例子1:

echo -e 'hello world\nnihao' | sed 's/hello/A/'
結果:
A world
nihao
例子2:

echo -e 'hello world\nnihao' | sed -n 's/hello/A/'
結果:加-n選項后什么也沒有顯示。
例子3:

echo -e 'hello world\nnihao' | 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 &ndash;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

六、數字定址和正則定址

1、關于定址的概念

默認情況下sed會對每一行內容進行匹配、處理、輸出,某些情況不需要對處理的文本全部編輯,只需要其中的一部分,比如1-10行,偶數行,或者是包含"hello"字符串的行,這種情況下就需要我們去定位特定的行來處理,而不是全部內容,這里把這個定位指定的行叫做"定址"。

2、數字定址

數字定址其實就是通過數字去指定具體要操作編輯的行,數字定址有幾種方式,每種方式都有不同的應用場景,下邊以舉例的方式來描述每種數字定址的用法。

例子1:

sed &ndash;n &lsquo;4s/hello/A/&rsquo; message
說明:將第4行中hello字符串替換為A,其它行如果有hello也不會被替換。

例子2:

sed &ndash;n &lsquo;2,4s/hello/A/&rsquo; message
說明:將第2-4行中hello字符串替換為A,其它行如果有hello也不會被替換。

例子3:

sed &ndash;n &lsquo;2,+4s/hello/A/&rsquo; message
說明:從第2行開始,再接著往下數4行,也就是2-6行,這些行會把hello字符替換為A。

例子4:

sed &ndash;n &lsquo;4,~3s/hello/A/&rsquo; message
說明:第4行開始,到第6行。解釋6的由來,"4,~3"表示從4行開始到下一個3的倍數,這里從4開始算,那就是6了,當然9就不是了,因為是要求3的第一個超過前邊數字4的倍數,感覺這種適用場景不會太多。

例子5:

sed &ndash;n &lsquo;4~3s/hello/A/&rsquo; message
說明:從第4行開始,每隔3行就把hello替換為A。比如從4行開始,7行,10行等依次+3行。這個比較常用,比如3替換為2的時候,也就是每隔2行的步調,可以實現奇數和偶數行的操作。

例子6:

sed &ndash;n &lsquo;$s/hello/A/&rsquo; message
說明:$符號表示最后一行,和正則中的$符號類似,但是第1行不用^表示,直接1就行了。

例子7:

sed -n &lsquo;1!s/hello/A/&rsquo; message
說明:!符號表示取反,該命令是將除了第1行,其它行hello替換為A,上述定址方式也可以使用!符號。

3、正則定址

正則定址使用目的和數字定址完全一樣,使用方式上有所不同,是通過正則表達式的匹配來確定需要處理編輯哪些行,其它行就不需要額外處理。

例子1:

sed -n &lsquo;/nihao/d&rsquo; message
說明:將匹配到nihao的行執行刪除操作。
例子2:

sed -n &lsquo;/^$/d&rsquo; message
說明:刪除空行
例子3:

sed -n &lsquo;/^TS/,/^TE/d&rsquo; message
說明:匹配以TS開頭的行到TE開頭的行之間的行,把匹配到的這些行刪除。

4、數字定址和正則定址混用

其實數字定址和正則定址可以配合使用,參考下邊的例子。

例子1:

sed -n &lsquo;1,/^TS/d&rsquo; message
說明:匹配從第1行到TS開頭的行,把匹配的行刪除。

5、關于定址的分組命令

例子1:

/^TS/,/^TE/{
s/CN/China/
s/Beijing/BJ/

說明:該命令表示將從TS開頭的行到TE開頭的行之間范圍的行內容中CN替換為China,并且把Beijing替換為BJ,類似于多命令之間用分號的那種方式,不過這樣定址代碼只寫了一遍,相當于執行了一條子命令。

例子2:

sed -n &lsquo;2,3s{/cn/china/;/a/b/}&rsquo; message
說明:效果類似例子1,有點數學上的乘法分配率的意思。

6、sed定址的總結

    sed 默認的命令執行范圍是全局編輯的,如果不明確指定行的話,命令會在所有輸入行上執行,如果想僅對其中部分行執行命令,可以使用地址限制。如果給了 2 個地址,即地址對(地址范圍),則命令匹配的這個地址范圍內執行,但是需要注意的是:對于像 "addr1,addr2" 這種形式的地址匹配,如果addr1 匹配,則匹配成功,"開關"打開,在該行上執行命令,此時不管 addr2 是否匹配,即使 addr2 在 addr1 這一行之前;接下來讀入下一行,如果addr2 匹配,則執行命令,同樣開關"關閉";如果 addr2 在 addr1 之后,則一直處理到匹配為止,換句話說,如果 addr2 一直不匹配,則開關一直不關閉,因此會持續執行命令到最后一行。

七、基本子命令


1、子命令a

子命令a表示在指定行下邊插入指定行的內容。

例子1:

sed &lsquo;a A&rsquo; message
說明:將message文件中每一行下邊都插入添加一行內容是A。
例子2:

sed &lsquo;1,2a A&rsquo; message
說明:將message文件中1-2行的下邊插入添加一行內容是A
例子3:

sed &lsquo;1,2a A\nB\nC&rsquo; message
說明:將message文件中1-2行的下邊分別添加3行,3行內容分別是A、B、C,這里使用了\n,插入多行內容都可以按照這種方式來實現。

2、子命令i

子命令i和a使用上基本上一樣,只不過是在指定行上邊插入指定行的內容。

例子1:

sed &lsquo;i A&rsquo; message
說明:將message文件中每一行上邊都插入添加一行內容是A。
例子2:

sed &lsquo;1,2i A&rsquo; message
說明:將message文件中1-2行的上邊插入添加一行內容是A
例子3:

sed &lsquo;1,2i A\nB\nC&rsquo; message
說明:將message文件中1-2行的上邊分別添加3行,3行內容分別是A、B、C,這里使用了\n,插入多行內容都可以按照這種方式來實現。

3、子命令c

子命令c是表示把指定的行內容替換為自己需要的行內容。

例子1:

sed &lsquo;c A&rsquo; message
說明:將message文件中所有的行內容都分別替換為A行內容。
例子2:

sed &lsquo;1,2c A&rsquo; message
說明:將message文件中1-2行的內容替換為A,注意這里說的是將1-2行所有的內容只替換為一個A內容,也就是1-2行內容編程了一行,定址如果連續就是這種情況。如果想把1-2行分別替換為A,可以參考下個例子的方式。

例子3:

sed &lsquo;1,2c A\nA&rsquo; message
說明:將message中1-2行內容分別替換為了A,需要在替換內容上手動加換行\n,這樣當然也可以將一行內容替換為多行內容。

4、子命令d

子命令d表示刪除指定的行內容,比較簡單,更容易理解。

例子1:

sed &lsquo;d&rsquo; message
說明:將message所有行全部刪除,因為沒有加定址表達式,所以平時如果需要刪除指定行內容,需要在子命令前加定址表達式。
例子2:

sed &lsquo;1,3d&rsquo; message
說明:將message文件中1-3行內容刪除。

5、子命令y

子命令y表示字符替換,可以替換多個字符,只能替換字符不能替換字符串,且不支持正則表達式,具體使用方法看例子。

例子1:

sed &lsquo;y/ab/AB/&rsquo; message
說明:把message中所有a字符替換為A符號,所有b字符替換為B符號。
強調一下,這里的替換源字符個數和目的字符個數必須相等;字符不支持正則表達式;源字符和目標字符每個字符需要一一對應。

6、子命令=

子命令=,可以將行號打印出來。
例子:

sed &lsquo;1,2=&rsquo; message
結果:

1
nihao
2
hello world
說明:將指定行的上邊顯示行號。

7、子命令r

子命令r,類似于a,也是將內容追加到指定行的后邊,只不過r是將指定文件內容讀取并追加到指定行下邊。 

例子1:

sed &lsquo;2r a.txt&rsquo; message
說明:將a.txt文件內容讀取并插入到message文件第2行的下邊。

8、子命令s

子命令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 &lsquo;s/hello/HELLO/&rsquo; message
說明:將message每行包含的第一個hello的字符串替換為HELLO,這是最基本的用法。

例子2:

sed -r &lsquo;s/[a-z]+ [0-9]+ [a-z]+/A/&rsquo; message
結果:A
說明:使用了擴展正則表達式,需要加-r選項。
例子3:

sed -r &lsquo;s/([a-z]+)( [0-9]+ )([a-z]+)/\1\2\3/&rsquo; message
結果:hello 123 world
說明:再看下一個例子就明白了。
例子4:

sed -r &lsquo;s/([a-z]+)( [0-9]+ )([a-z]+)/\3\2\1/&rsquo; message
結果:world 123 hello
說明:\1表示正則第一個分組結果,\2表示正則匹配第二個分組結果,\3表示正則匹配第三個分組結果。
例子5:

sed -r &lsquo;s/([a-z]+)( [0-9]+ )([a-z]+)/&/&rsquo; message
結果:hello 123 world
說明:&表示正則表達式匹配的整個結果集。
例子6:

sed -r &lsquo;s/([a-z]+)( [0-9]+ )([a-z]+)/111&222/&rsquo; message
結果:111hello 123 world222
說明:在匹配結果前后分別加了111、222。
例子7:

sed -r &lsquo;s/.*/111&222/&rsquo; message
說明:在message文件中每行的首尾分別加上111、222。
例子8:

sed &lsquo;s/i/A/g&rsquo; message
說明:把message文件中每行的所有i字符替換為A,默認不加g標記時只替換每行的第一個字符。
例子9:

sed &lsquo;s/i/A/2&rsquo; message
說明:把message文件中每行的第2個i字符替換為A。
例子10:

sed -n &lsquo;s/i/A/p&rsquo; message
說明:加-p標記會把被替換的行打印出來,再加上-n選項會關閉模式空間打印模式,因此該命令的效果就是只顯示被替換修改的行。
例子11:

sed -n &lsquo;s/i/A/w b.txt&rsquo; message
說明:把message文件中內容的每行第一個字符i替換為A,然后把修改內容另存為b.txt文件。
例子12:

sed -n &lsquo;s/i/A/i&rsquo; message
說明:把message文件中每一行的第一個i或I字符替換為A字符,也即是忽略大小寫。

八、sed工作模式

1、模式空間和保持空間

模式空間初始化為空,處理完一行后會自動輸出到屏幕并清除模式空間;保持空間初始化為一個空行,也就是默認帶一個\n,處理完后不會自動清除。模式空間和保持空間,從程序的角度去看,其實就是sed在工作的時候占用了一些內存空間和地址,sed工作完畢就會把內存釋放并歸還給操作系統。

2、sed工作流程

大概簡單描述一下sed的工作流程,讀取文件的一行,存入模式空間,然后進行所有子命令的處理,處理完后默認會將模式空間的內容輸出打印到標準輸出,也就是在屏幕上顯示出來,接著清空模式空間的內存,繼續讀取下一行的內容到模式空間,繼續處理,依次循環處理。

3、模式空間和保持空間的置換

h:把模式空間內容覆蓋到保持空間中
H:把模式空間內容追加到保持空間中
g:把保持空間內容覆蓋到模式空間中
G:把保持空間內容追加到模式空間中
x:交換模式空間與保持空間的內容

4、實例用法

測試文件:

# cat test.txt
11111
22222
33333
44444
例子1:

sed &lsquo;{1h;2,3H;4G}&rsquo; test.txt
結果:
11111
22222
33333
44444
11111
22222
33333
解釋說明:略。懶得寫了。

例子2:

sed &lsquo;{1h;2x;3g;$G}&rsquo; test.txt
結果:
11111
11111
22222
44444
22222
解釋說明:略。

例子3:

sed &lsquo;{1!G;h;$!d}&rsquo; test.txt
結果:
44444
33333
22222
11111

九、高級子命令

高級子命令比較少,但是比較復雜,平時用的也會相對少些,卻也很重要,有的內容處理不用高級子命令是完成不了的。

n:讀入下一行到模式空間,例:&rsquo;4{n;d}&rsquo; 刪除第5行。
N:追加下一行到模式空間,再把當前行和下一行同時應用后面的命令。
P:輸出多行模式空間的第一部分,直到第一個嵌入的換行符位置。在執行完腳本的最后一個命令之后,模式空間的內容自動輸出。P命令經常出現在N命令之后和D命令之前。
D:刪除模式空間中第一個換行符的內容。它不會導致讀入新的輸入行,相反,它返回到腳本的頂端,將這些指令應用與模式空間剩余的內容。這3個命令能建立一個輸入、輸出循環,用來維護兩行模式空間,但是一次只輸出一行。

例子1:

sed &lsquo;N;$!P;D&rsquo; a.txt
#說明:刪除文件倒數第二行
例子2:

sed &lsquo;N;$!P;$!D;$d&rsquo; a.txt
# 說明:刪除文件最后兩行

十、分支和測試

分支命令用于無條件轉移,測試命令用于有條件轉移。

1、分支branch

跳轉的位置與標簽相關聯。
如果有標簽則跳轉到標簽所在的后面行繼續執行。
如果沒有標簽則跳轉到腳本的結尾處。
標簽:以冒號開始后接標簽名,不要在標簽名前后使用空格。

2、跳轉到標簽指定位置

測試文件:

grep seker /etc/passwd
seker:x:500:500::/home/seker:/bin/bash
例子1:

grep seker /etc/passwd | sed &lsquo;:top;s/seker/blues/;/seker/b top;s/5/555/&rsquo;
結果:blues:x:55500:500::/home/blues:/bin/bash
選擇執行
例子2:

grep &lsquo;seker&rsquo; /etc/passwd | sed &lsquo;s/seker/blues/;/seker/b end;s/5/555/;:end;s/5/666/&rsquo;
結果:blues:x:66600:500::/home/seker:/bin/bash
測試命令,如果前一個替換命令執行成功則跳轉到腳本末尾(case結構)
例子3:

grep &lsquo;seker&rsquo; /etc/passwd | sed &lsquo;s/seker/ABC;t;s/home/DEF/;t;s/bash/XYZ/&rsquo;
結果:ABC:x:500:500::/home/seker:/bin/bash
例子4:

grep &lsquo;zorro&rsquo; /etc/passwd | sed &lsquo;s/seker/ABC/;t;s/home/DEF/;t;s/bash/XYZ&rsquo;
結果:zorro:x:500:500::/DEF/zorro:/bin/bash
與標簽關聯,跳轉到標簽位置。
例子5:

grep &lsquo;seker&rsquo; /etc/passwd | sed &lsquo;s/seker/ABC/;t end;s/home/DEF/;t;end;s/bash/XYZ&rsquo;
結果:ABC:x:500:500::/home/seker:/bin/XYZ

十一、sed實戰練習

實例1:刪除文件每行的第二個字符。

sed -r 's/(.*)(.)$/\1/'
實例2:刪除文件每行的最后一個字符。

sed -r 's/(.*)(.)$/\1/'
實例3:刪除文件每行的倒數第2個單詞。

sed -r &lsquo;s/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*$)/\1\2\4\5/&rsquo; /etc/passwd
實例4:交換每行的第一個字符和第二個字符。

sed -r &lsquo;s/(.)(.)(.*)/\2\1\3/&rsquo; /etc/passwd
實例5:交換每行的第一個單詞和最后一個單詞。

sed -r &lsquo;s/([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)([^a-Z]*$)/\5\2\3\4\1\6/&rsquo; /etc/passwd
實例6:刪除一個文件中所有的數字。

sed &lsquo;s/[0-9]//g&rsquo; /etc/passwd
實例7:用制表符替換文件中出現的所有空格。

sed -r &lsquo;s/ +/\t/g&rsquo; /etc/passwd
實例8:把所有大寫字母用括號()括起來。

sed -r &lsquo;s/([A-Z])/(\1)/g&rsquo; /etc/passwd
實例9:打印每行3次。

sed &lsquo;p;p&rsquo; /etc/passwd
實例10:隔行刪除

sed &lsquo;0~2{=;d}&rsquo; /etc/passwd
實例11:把文件從第22行到第33行復制到56行后面。

sed &lsquo;22h;23,33H;56G&rsquo; /etc/passwd
實例12:把文件從第22行到第33行移動到第56行后面。

sed &lsquo;22{h;d};23,33{H;d};56g&rsquo; /etc/passwd
實例13:只顯示每行的第一個單詞。

sed -r &lsquo;s/([a-Z]+)([^a-Z]+)(.*)/\1/&rsquo; /etc/passwd
實例14:打印每行的第一個單詞和第三個單詞。

sed -r &lsquo;s/([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)(.*)/\1\t\5/&rsquo; /etc/passwd
實例15:將格式為mm/yy/dd的日期格式換成 mm;yy;dd

date '+%m/%y/%d' | sed 's/\//;/g'

關于“sed -i命令怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“sed -i命令怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sed
AI

阿尔山市| 高州市| 靖西县| 巩留县| 贡嘎县| 昭觉县| 延津县| 逊克县| 汉中市| 灵璧县| 思茅市| 濮阳市| 锦屏县| 芮城县| 桂林市| 渭南市| 和林格尔县| 泰和县| 石阡县| 汽车| 通榆县| 沧州市| 梁山县| 合川市| 南投县| 临漳县| 临猗县| 镇宁| 静宁县| 江川县| 驻马店市| 宜昌市| 额尔古纳市| 天峻县| 临武县| 建宁县| 宝山区| 乌恰县| 邵东县| 五家渠市| 新蔡县|