日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sed教程(四):基本命令、特殊字符、字符串

發布時間:2025/3/21 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sed教程(四):基本命令、特殊字符、字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本教程將介紹一些有用的sed命令和使用示例。考慮一下我們有一個文本文件books.txt待處理,它有以下內容:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

刪除 d 命令

sed刪除命令用 d 字符表示,并將其用于刪除從一個給定的模式緩沖器的一行或多行。以下是 sed 刪除命令的基本語法:

[address1[,address2]]d

這里address1和address2分別為起始和結束地址,其可以是行號或模式串。這兩個地址是可選參數,如果不提供它們作為前綴-d命令,那么它會刪除,如下圖所示所有行:

[jerry]$ sed 'd' books.txt

上面的命令將刪除所有傳遞給 sed 的行并且沒有行數據會打印在屏幕上。

下面指示 sed 只在某些行上使用。下面的例子中只刪除4行。

[jerry]$ sed '4d' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

此外,sed也接受用逗號分隔地址范圍(,)。可以指示sed 刪除N1到N2行。例如,下面的例子將刪除從2到4的所有行。

[jerry]$ sed '2,4d' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

也可以指定模式作為地址。下面的示例刪除作者是 Paulo Coelho的所有書籍。

[jerry]$ sed '/Paulo Coelho/d' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

也可以使用文本模式指定一個地址范圍。下面的示例刪除模式Storm 和Fellowship之間的所有行。

[jerry]$ sed '/Storm/,/Fellowship/d' books.txt 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864 可以使用美元符號($),加號(+),和波浪符號(?)運算符使用sed -d命令刪除。

寫入w 命令

sed的寫命令是由 w 字符表示,并且它用于存儲模式緩沖區的一個文件中內容。以下是sed 寫命令的基本語法:

[address1[,address2]]w

這里,address1 和 address2 分別是模式緩沖存儲器的起始和結束地址,該地址可以是行號或模式串。這兩個地址是可選參數,如果不提供它們的前綴給w命令,那么它將存儲完整的模式緩沖區到給定的文件,如下所示:

[jerry]$ sed -n 'w books.bak' books.txt

上面的命令將創建另一個名為books.bak的文件。這是books.txt文件復制文件。

sed允許創建包含源文件只有某些行的文件。以下命令是副本只從books.txt偶數行數據到books.bak文件。

[jerry]$ sed -n '2~2w books.bak' books.txt

如果將檢查books.bak文件的內容,那么它將有以下幾行:

2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

也可以指定模式作為地址。下面的例子中存儲作者為?Paulo Coelho 的所有書籍。

[jerry]$ sed -n -e '/Paulo Coelho/w books.bak' books.txt

如果將檢查books.bak文件的內容,那么它將有以下幾行:

3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288

追加 a 命令

任何一個文本編輯器的最有用的操作是提供附/追加功能。sed通過其由一個字符表示追加命令支持該操作。以下是sed追加命令的基本語法:

[address]a 'text to be appended'

這里的地址是模式緩沖區地址,可以是行號或模式字符串來表示,其中的文本將被追加的位置。以下是追加后的行數4新書項命令。

[jerry]$ sed '4a 7) Adultry, Paulo Coelho, 234' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 7) Adultry, Paulo Coelho, 234 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

可以使用$符號插入的文件結束后面的行,如下所示:

[jerry]$ sed '$a 7) Adultry, Paulo Coelho, 234' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864 7) Adultry, Paulo Coelho, 234

除了行數,還可以使用文本模式指定一個地址。例如,下面的例子匹配字符串后追加文本The Alchemist.

[jerry]$ sed '/The Alchemist/a 7) Adultry, Paulo Coelho, 234' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 7) Adultry, Paulo Coelho, 234 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

修改 c 命令

sed提供更改或更換用c字符來表示命令。此命令可以幫助更換新文本的現有行。以下是 sed 改變命令的基本語法:

[address1[,address2]]c 'Next text'

這里,address1 和 address2 分別是模式緩沖區的起始和結束地址,該地址可以是行號或模式串。這兩個地址是可選參數,如果不提供前綴,則該命令將替換為新文本的每一行,如下所示:

[jerry]$ sed 'c This is new text' books.txt

執行上面的代碼,會得到如下結果:

This is new text This is new text This is new text This is new text This is new text This is new text

下面是示例替換一些其他文本的第三行。

[jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) Adultry, Paulo Coelho, 324 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

還可以指定要匹配并采用c運算符的幫助下替換模式如下:

[jerry]$ sed '/The Alchemist/c 3) Adultry, Paulo Coelho, 324' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) Adultry, Paulo Coelho, 324 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

sed 還允許替換多行以及一行。下面的示例是從第4行到第6行,將它們替換為新的文本。

[jerry]$ sed '4, 6c 4) Adultry, Paulo Coelho, 324' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) Adultry, Paulo Coelho, 324

插入 i 命令

插入命令工作起來作為追加的方式相同。唯一的區別在于,它插入一個特定位置之前的行。以下是sed的插入命令的基本語法:

[address]i 'Text to be inserted'

這里地址是模式緩沖區地址,可以用行號或模式串來表示,其中的文本將被插入的位置。下面是插入第4行之前的一本新書項命令。

[jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 7) Adultry, Paulo Coelho, 324 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

在一個文件的開頭插入文本,提供的行地址為1.下列命令說明這一點:

[jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt

執行上面的代碼,會得到如下結果:

7) Adultry, Paulo Coelho, 324 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

下面的命令插入的最后一行前行。

[jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 7) Adultry, Paulo Coelho, 324 6) A Game of Thrones, George R. R. Martin, 864

轉換 y 命令

sed提供一個命令轉換到字符,它表示為y。它通過位置轉換字符。以下是sed轉換命令基本語法:

[address1[,address2]]y/list-1/list-2/

注意,轉換是基于字符的,從列表1到可用的字符在表2中的位置是相同的位置和兩個列表必須是明確的字符列表。正則表達式和字符集是不支持的。此外,表1和表2的尺寸必須相同。

下面的示例將大寫字母為小寫字母:

[jerry]$ echo "BCDAFE" | sed 'y/ABCDEF/abcdef/'

執行上面的代碼,會得到如下結果:

bcdafe

Sed l 命令

sed使用 -l 命令可以在文本顯示隱藏字符。例如,\t制表符和$符結束行。下面給出的是sed的 i 命令的語法。

[address1[,address2]]l or[address1[,address2]]l [len]

現在,在 books.txt 輸入一個標簽空間,并嘗試使用 l 命令顯示的內容:

[jerry]$ sed -n 'l' books.txt

執行上面的代碼,會得到如下結果:

1)\tA Storm of Swords, George R. R. Martin, 1216 $ 2) The Two Towers, J. R. R. Tolkien, 352 $ 3) The Alchemist, Paulo Coelho, 197 $ 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 $ 5) The Pilgrimage, Paulo Coelho, 288 $ 6) A Game of Thrones, George R. R. Martin, 864$

類似于其他sed的命令,它也接受行號和模式作為地址。

可以指示sed的一定字符數之后進行換行。下面的例子25個字符后換行。

[jerry]$ sed -n 'l 25' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords,Geo\ rge R. R. Martin,1216$ 2) The Two Towers,J. R. \ R. Tolkien,352$ 3) The Alchemist,Paulo C\ oelho,197$ 4) The Fellowship of the\ Ring,J. R. R. Tolkien,4\ 32$ 5) The Pilgrimage,Paulo \ Coelho,288$ 6) A Game of Thrones,Geo\ rge R. R. Martin ,864$

纏繞限0意味著永遠斷行,除非有一個新行字符。下面簡單的命令說明了這一點。

[jerry]$ sed -n 'l 0' books.txt

執行上面的代碼,會得到如下結果:

1) A Storm of Swords,George R. R. Martin,1216$ 2) The Two Towers,J. R. R. Tolkien,352$ 3) The Alchemist,Paulo Coelho,197$ 4) The Fellowship of the Ring,J. R. R. Tolkien,432$ 5) The Pilgrimage,Paulo Coelho,288$ 6) A Game of Thrones,George R. R. Martin,864$

退出 q 命令

退出命令表示 sed 退出當前執行流程,它是由q命令表示。以下是 sed 的基本語法退出命令:

[address]q [address]q [value]

需要注意的是退出命令不接受地址范圍,它僅支持一個地址。默認情況下,Sed如下讀取,執行和重復的工作流程;但退出命令時只是停止當前執行并退出來。

以下是命令從該文件的第3行打印。

[jerry]$ sed '3 q' books.txt

在執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197

還可以使用文本模式,而不是行號。當一個給定的模式匹配成功如下命令退出。

[jerry]$ sed '/The Alchemist/ q' books.txt

在執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197

除了這一點,sed還可以接受,可用于作為退出狀態值。以下命令顯示了它的退出狀態為100。

[jerry]$ sed '/The Alchemist/q 100' books.txt

在執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197

現在讓我們驗證的退出狀態。

[jerry]$ echo $?

在執行上面的代碼,會得到如下結果:

100

讀取 r 命令

可以讓Sed讀取文件的內容,并顯示在一個特定的條件相匹配。讀指令由r操作者來表示。以下是Sed的基本語法讀取命令:

[address]r file

讓我們用一個簡單的例子了解它。創建一個名為junk.txt示例文件。

[jerry]$ echo "This is junk text." > junk.txt

下面的命令指示Sed來讀取 junk.txt 的內容,在第三行之后插入。

[jerry]$ sed '3 r junk.txt' books.txt

在執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 This is junk text. 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

下面的命令在第三,第四和第五行之后插入 junk.txt 內容。

[jerry]$ sed '3, 5r junk.txt' books.txt

在執行上面的代碼,得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 This is junk text. 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 This is junk text. 5) The Pilgrimage, Paulo Coelho, 288 This is junk text. 6) A Game of Thrones, George R. R. Martin, 864

類似其他的sed命令,讀取命令也接受模式作為地址。例如,下面的命令插入junk.txt 文件內容時,所述模式匹配成功。

[jerry]$ sed '/Paulo/ r junk.txt' books.txt

在執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 This is junk text. 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 This is junk text. 6) A Game of Thrones, George R. R. Martin, 864

執行 e 命令

我們可以從Sed使用執行命令,執行外部命令,它是通過電子郵件操作符表示。以下是Sed執行命令的基本語法:

[address1[,address2]]e [command]

這里,address1 和 address2是模式緩沖存儲器的地址,該地址可以為行號或模式字符串,及命令將執行一個給定的地址。

例如,下面的 sed 命令是當遇到從給定的文件中的第三行之前執行 UNIX 日期命令。

[jerry]$ sed '3 e date' books.txt

當執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 Sun Sep 7 18:04:49 IST 2014 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

類似其他的命令,它也可以接受模式作為地址。例如,下面示例執行date命令,當一個模式匹配成功。注意,每一個模式匹配后,首先執行該命令,然后將模式緩沖區的內容顯示。

[jerry]$ sed '/Paulo/ e date' books.txt

當執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 Sun Sep 7 18:06:04 IST 2014 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 Sun Sep 7 18:06:04 IST 2014 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

當 e 之后沒有命令提供,它將該模式緩沖區的內容作為一個外部命令。為了說明這一點,創建一些簡單的命令在 commands.txt 的文件中。

[jerry]$ echo -e "date\ncal\nuname" > commands.txt [jerry]$ cat commands.txt

當執行上面的代碼,會得到如下結果:

date cal uname

從文件的命令不言自明。下面簡單的例子,提供了一個使用 sed 腳本的命令:

[jerry]$ sed 'e' commands.txt

當執行上面的代碼,會得到如下結果:

Sun Sep 7 18:14:20 IST 2014 September 2014 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Linux

正如其他sed命令,在執行命令也接受地址的所有的有效范圍。

雜項命令

默認情況下,sed操作在一行上,但是它也可以在多行上操作。多行命令由大寫字母表示。例如,多行命令不同的是,N個命令不清除并打印模式空間。相反,它增加了一個新行(\n),在當前的模式空間的末端,并從輸入文件中的下一行追加到當前模式空間,并與Sed的標準流量通過執行Sed命令的其余部分將繼續。下面給出的是N命令的語法。

[address1[,address2]]N

稍微修改 books.txt 文件。現在,文件中包含的書名后面跟著它的作者姓名。修改完畢后我們的文件看起來像這樣:

A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho A Game of Thrones George R. R. Martin

讓我們打印一個逗號分隔的書名和各自的作者名單。下面的例子說明了這一點。

[jerry]$ sed 'N; s/\n/,/g' books.txt

當執行上面的代碼,會得到如下結果:

A Storm of Swords, George R. R. Martin The Two Towers, J. R. R. Tolkien The Alchemist, Paulo Coelho The Fellowship of the Ring, J. R. R. Tolkien The Pilgrimage, Paulo Coelho A Game of Thrones, George R. R. Martin

了解上面的例子如何工作。 n命令讀取第一行,即Storm 模式緩沖區,并追加\n接著的下一行。模式空間現在包含Swords\nGeorge R. R. Martin。在接下來的步驟中,我們用逗號替換換行符。

就像 p 這樣的命令,我們有一個 P 命令打印的第一部分(最多嵌入的換行符)由 N 命令創建的多行模式空間。下面給出的是 P 命令的語法,它類似于p命令。

[address1[,address2]]P

在前面的例子中,我們看到了N命令創建的書名和作者的新一行 - 分隔的列表。打印它僅第一部分,即,這本書的標題。下面的命令說明了這一點。

[jerry]$ sed -n 'N;P' books.txt

當執行上面的代碼,會得到如下結果:

A Storm of Swords The Two Towers The Alchemist The Fellowship of the Ring The Pilgrimage A Game of Thrones

請注意,在不存在 N,它的行為相同于 p 命令。下面簡單的命令說明了這種情況。

[jerry]$ sed -n 'P' books.txt

當執行上面的代碼,會得到如下結果:

A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho A Game of Thrones George R. R. Martin

除了這一點,Sed還提供了用于檢查版本的一個 v 命令。如果所提供的版本大于所述安裝 sed 的版本,然后命令執行失敗。請注意,此選項是GNU具體,可能無法與Sed的其他版本的工作。下面給出的是 v 命令的語法。

[address1[,address2]]v [version]

首先,找出Sed的當前版本。

[jerry]$ sed --version

當執行上面的代碼,會得到如下結果:

sed (GNU sed) 4.2.2

在下面的例子中,Sed版本高于4.2.2版本,因此sed命令中止執行。

[jerry]$ sed 'v 4.2.3' books.txt

當執行上面的代碼,會得到如下結果:

sed: -e expression #1, char 7: expected newer version of sed

但是,如果所提供的版本是小于或等于4.2.2版本,則命令會按預期工作。

[jerry]$ sed 'v 4.2.2' books.txt

當執行上面的代碼,會得到如下結果:

A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho A Game of Thrones George R. R. Martin



Sed提供了被當作命令兩個特殊字符。本章說明了這兩個特殊字符的使用。嘗試使用這些命令,考慮有一個文本文件books.txt待處理,它有以下內容:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

= 命令

=命令將行號后跟其標準輸出流的內容。下面給出的是=命令的語法:

[address1[,address2]]=

這里address1 和 address2分別為起始和結束地址,其可以是行號或模式串。這兩個地址是可選參數,如果不提供它們作為前綴=命令,如下圖所示,將打印的所有行的行號:

[jerry]$ sed '=' books.txt

當執行上面的代碼,會得到如下結果:

1 1) A Storm of Swords, George R. R. Martin, 1216 2 2) The Two Towers, J. R. R. Tolkien, 352 3 3) The Alchemist, Paulo Coelho, 197 4 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5 5) The Pilgrimage, Paulo Coelho, 288 6 6) A Game of Thrones, George R. R. Martin, 864

下面的命令打印首4行的行號和剩余不帶行號:

[jerry]$ sed '1,4=' books.txt

當執行上面的代碼,會得到如下結果:

1 1) A Storm of Swords, George R. R. Martin, 1216 2 2) The Two Towers, J. R. R. Tolkien, 352 3 3) The Alchemist, Paulo Coelho, 197 4 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

下面的例子打印包含模式“Paulo”的行號。

[jerry]$ sed '/Paulo/=' books.txt

當執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

下面的例子將打印僅在最后一行的行號:

[jerry]$ sed '$=' books.txt

當執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6 6) A Game of Thrones, George R. R. Martin, 864

下面的例子僅打印對所有行的行號:

[jerry]$ sed -n '=' books.txt

當執行上面的代碼,會得到如下結果:

1 2 3 4 5 6

下面的例子打印文件中的行的總數:

[jerry]$ sed -n '$=' books.txt

當執行上面的代碼,會得到如下結果:

6

& 命令

Sed 支持特殊字符和存儲匹配的模式,每當一個模式匹配成功。它經常被用于替代命令。看看如何能夠利用這種高效的特點。

在book.txt文件中的每一行編號。添加詞語數量在每一行的開頭。下面的例子說明了這一點:

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

當執行上面的代碼,會得到如下結果:

Book number 1) A Storm of Swords, George R. R. Martin, 1216 Book number 2) The Two Towers, J. R. R. Tolkien, 352 Book number 3) The Alchemist, Paulo Coelho, 197 Book number 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 Book number 5) The Pilgrimage, Paulo Coelho, 288 Book number 6) A Game of Thrones, George R. R. Martin, 864

這個例子是很簡單的。首先尋找一個數字,這是行號的第一次出現(這就是為什么使用[[:數字:]])和桑達自動存儲在特殊字符和匹配模式。在第二步驟中,我們將插入每個匹配的模式,也就是說,每行之前之前詞語的數量。

再舉一個例子。在book.txt文件,最后一個數字是書的頁數。在這之前加上“Pages=”。要做到這一點,找到數字的最后一次出現,并用“Pages=&”代替。這里,&存儲匹配模式,即,頁面的數量

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt

當執行上面的代碼,會得到如下結果:

1) A Storm of Swords, George R. R. Martin, Pages = 1216 2) The Two Towers, J. R. R. Tolkien, Pages = 352 3) The Alchemist, Paulo Coelho, Pages = 197 4) The Fellowship of the Ring, J. R. R. Tolkien, Pages = 432 5) The Pilgrimage, Paulo Coelho,Pages = 288 6) A Game of Thrones, George R. R. Martin, Pages = 864

從目前來看,只記得[[:數字:]]* $找到數字的最后出現。在該章中的“正則表達式中,我們將探討更多的正則表達式。



本教程將介紹一些字符串處理的重要sed命令。考慮我們有一個文本文件books.txt 要處理,它有以下內容:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

替換命令

“查找和替換”文本替換操作字符串最常見。下面給出的是替換命令的語法:

[address1[,address2]]s/pattern/replacement/[flags]

這里,address1 和 address2分別是起始和結束地址,它可以是行號或模式串。這兩個地址是可選參數。

該模式是要替換的替換字符串的字符串。此外,也可以指定可選的標志,以增強功能。

以下是 sed 命令替換所有books.txt 用逗號與豎線(|)。

[jerry]$ sed 's/,/ | /' books.txt

執行上面的代碼,得到如下結果:

1) A Storm of Swords | George R. R. Martin, 1216 2) The Two Towers | J. R. R. Tolkien, 352 3) The Alchemist | Paulo Coelho, 197 4) The Fellowship of the Ring | J. R. R. Tolkien, 432 5) The Pilgrimage | Paulo Coelho, 288 6) A Game of Thrones | George R. R. Martin, 864

如果仔細觀察,只有第一個逗號替換,第二保持原樣。為什么呢?只要模式匹配,Sed 替換為替換字符串并且移動到下一行。默認情況下,它僅替換第一次出現。要替換所有出現的,使用Sed全局標志(g)如下:

[jerry]$ sed 's/,/ | /g' books.txt

執行上面的代碼,得到如下結果:

1) A Storm of Swords | George R. R. Martin | 1216 2) The Two Towers | J. R. R. Tolkien | 352 3) The Alchemist | Paulo Coelho | 197 4) The Fellowship of the Ring | J. R. R. Tolkien | 432 5) The Pilgrimage | Paulo Coelho | 288 6) A Game of Thrones | George R. R. Martin | 864

可以指示Sed執行文本替換,只有當一個模式匹配成功。下面的示例替換逗號(,)用豎線(|)僅當行包含模式。

[jerry]$ sed '/The Pilgrimage/ s/,/ | /g' books.txt

執行上面的代碼,得到如下結果:

1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage | Paulo Coelho | 288 6) A Game of Thrones, George R. R. Martin, 864

Sed 也可以取代的模式發生的特定事件。替換逗號(,)以豎線的唯一的第二個實例(|)。下面是在sed命令(或標志的地方),當前匹配的第二個出現的有多少。

[jerry]$ sed 's/,/ | /2' books.txt

執行上面的代碼,得到如下結果:

1) A Storm of Swords, George R. R. Martin | 1216 2) The Two Towers, J. R. R. Tolkien | 352 3) The Alchemist, Paulo Coelho | 197 4) The Fellowship of the Ring, J. R. R. Tolkien | 432 5) The Pilgrimage,Paulo Coelho | 288 6) A Game of Thrones, George R. R. Martin | 864

可以使用P標志,如下打印不僅改變的行:

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt

執行上面的代碼,得到如下結果:

3) The Alchemist, PAULO COELHO, 197 5) The Pilgrimage, PAULO COELHO, 288

可以在另一個文件中保存更改的行。為了實現這種結果,可以使用 w 標志如下所示:

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt

現在 junk.txt 文件已全部更改的文件。讓我們驗證 junk.txt 文件的內容。

[jerry]$ cat junk.txt

執行上面的代碼,得到如下結果:

3) The Alchemist, PAULO COELHO, 197 5) The Pilgrimage, PAULO COELHO, 288

執行不區分大小寫的替換,可以使用i標志,這意味著忽略大小寫。下面的例子執行不區分大小寫的替換。

[jerry]$ sed -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt

執行上面的代碼,得到如下結果:

3) The Alchemist, PAULO COELHO, 197 5) The Pilgrimage, PAULO COELHO, 288

非標分隔符

通常,反斜杠(/)作為分隔符,但有時是用其它支持定界符以用 sed 更方便。

到目前為止,我們已經使用了只有反斜杠(/)字符作為分隔符,但我們也可以使用豎線(|),at符號(@),插入符號(^),感嘆號作為分隔符(!)。下面的示例演示了如何使用其他字符作為分隔符。

下面的例子使用豎線(|)作為分隔符:

[jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'

執行上面的代碼,得到如下結果:

/home/jerry/src/sed/sed-4.2.2/sed

同樣,我們可以用“at”符號(@)使用作為分隔符,如下所示:

[jerry]$ echo "/bin/sed" | sed 's@/bin/sed@/home/jerry/src/sed/sed-4.2.2/sed@'

執行上面的代碼,得到如下結果:

/home/jerry/src/sed/sed-4.2.2/sed

同樣,我們可以使用插入符號(^)作為分隔符,如下所示:

[jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'

執行上面的代碼,得到如下結果:

/home/jerry/src/sed/sed-4.2.2/sed

同樣,我們可以使用感嘆號作為分隔符如下(!):

[jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'

執行上面的代碼,得到如下結果:

/home/jerry/src/sed/sed-4.2.2/sed

創建一個子串

我們學到了強大的替換命令。看看是否可以找到一個匹配的文本字符串。了解如何用一個例子來說明。

看看下面的文字:

[jerry]$ echo "Three One Two"

假設我們要安排成一個序列。意味著,它應該打印一份,再兩個,最后三個。下面的單行代碼執行。

[jerry]$ echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'

sed 子串可以通過使用分組操作員指定,并且它必須以轉義字符作為前綴,即\(和\)。

在這里,\ w是一個正則表達式匹配任何字母或下劃線和“+”號來匹配多個字符。換句話說,正則表達式 \(\w\+\)從輸入串中的單個字相匹配。

這個子串由\N,N是子串號轉介。因此,\2打印第二子串,即一個; \3打印第三子串,即兩種;和\1打印第一子,即Three

讓我們分開這些話通過逗號(,)并相應修改則表達式。

[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'

執行上面的代碼,得到如下結果:

One,Two,Three

字符串替換標志

GNU Sed 提供可在替換字符串中使用一些特殊的轉義序列。請注意,這些字符串替換標志是GNU具體指定,可能無法與Sed其他變種進行工作。在這里,我們將討論的字符串替換標志。

?\L 標識

當在替換字符串中指定\L,它把該單詞的所有剩余的字符,\L以小寫字符。例如,字符“ULO”被視為小寫字符。

[jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt

執行上面的代碼,得到如下結果:

3) The Alchemist, PAulo Coelho, 197 5) The Pilgrimage, PAulo Coelho, 288

\u 標識

\u被替換字符串指定,它把后\u,如大寫字符前的字符。在下面的例子中,\u字符為'a'和'o'之前使用。因此,Sed將這些字符轉為大寫字母。

[jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt

執行上面的代碼,得到如下結果:

3) The Alchemist, pAulO Coelho, 197 5) The Pilgrimage, pAulO Coelho, 288

\U 標識

當\U在替換字符串中指定,把單詞的所有剩余的字符\U后為大寫字母。

[jerry]$ sed -n 's/Paulo/\Upaulo/p' books.txt

執行上面的代碼,得到如下結果:

3) The Alchemist, PAULO Coelho, 197 5) The Pilgrimage, PAULO Coelho, 288

?\E 標識

\E標志應使用\L或\U。它標志\L或\U開始停止轉換。在下面的例子中,只有第一個字被替換為大寫字母。

[jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt

執行上面的代碼,得到如下結果:

3) The Alchemist, PAULO coelho, 197 5) The Pilgrimage, PAULO coelho, 288


from: http://www.yiibai.com/sed/sed_useful_recipes.html

總結

以上是生活随笔為你收集整理的Sed教程(四):基本命令、特殊字符、字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本美女性生活视频 | 老熟妇毛片 | 四虎成人网| 国产男女av | 女性裸体不遮胸图片 | 免费看黄在线网站 | 国产欧美日韩综合精品一区 | av55 | 免费高清av在线看 | 国产三级黄色 | 韩国三级视频在线观看 | 亚洲欧洲精品在线 | 亚洲深夜在线 | 久久久久无码国产精品一区李宗瑞 | 99久久婷婷国产综合精品 | 公侵犯人妻中文字慕一区二区 | 好爽…又高潮了毛片免费看 | 丁香婷婷在线观看 | 色播基地 | 国产又粗又猛又爽 | 亚洲热影院| 国产aaa级片 | 久久久久一级 | 欧美成人777 | 五月天青青草 | 国产精品va在线 | 亚洲精品久久久久久无码色欲四季 | 91性高潮久久久久久久久 | 明日花绮罗高潮无打码 | 亚洲性欧美 | 亚洲自拍偷拍第一页 | 刘玥91精选国产在线观看 | 久久国产人妻一区二区免色戒电影 | 日韩欧美黄色网址 | 99久久精品国产色欲 | 欧美 亚洲 视频 | 色网站免费观看 | 99精品人妻少妇一区二区 | 欧美卡一卡二 | 国产精品久久久久久中文字 | 特大黑人巨交吊性xxxx视频 | 五月婷婷开心网 | 涩涩视频在线观看免费 | 五十路中文字幕 | 日韩欧美xxx | 制服丝袜先锋 | 93久久精品日日躁夜夜躁欧美 | 日韩成人一级 | 国产一国产二国产三 | 国产精品一区二区三区免费视频 | 国产欧美日韩一区 | 美女丝袜av | 日本香蕉网 | 久久av资源站 | 国产成人主播 | 男女日批在线观看 | 一区二区三区中文字幕 | ass亚洲尤物裸体pics | 在线成人日韩 | 成人免费黄色大片v266 | 亚洲色图少妇 | 99re在线观看 | 一本色道久久综合熟妇 | 99久久精品免费看国产 | 囯产精品一品二区三区 | 午夜影院黄色 | 亚洲人在线观看 | 激情午夜视频 | 欧美丰满熟妇xxxxx | 自拍视频啪 | 国产有码在线 | 成人黄色视屏 | 亚洲一区二区三区电影 | 深爱五月激情网 | 成年人黄色在线观看 | 中文字幕专区 | 国产一区在线免费观看 | 天堂中文在线观看视频 | 成人精品久久久 | 欧美日韩在线免费 | 成人欧美视频在线观看 | 久久久久久人妻一区二区三区 | 久久8| 国产一区二区三区小说 | 先锋影音一区二区 | 热播网 | 精品免费观看 | 亚洲成人精品一区二区三区 | 久久综合精品国产二区无码不卡 | 丝袜ol美脚秘书在线播放 | 在线观看一二三区 | 亚洲免费观看视频 | 亚洲最大福利网 | 亚洲一区和二区 | 国产免费av网站 | 成人免费毛片aaaaaa片 | 亚洲人人夜夜澡人人爽 | 精品人妻天天爽夜夜爽视频 | 国产一区高清 | 91免费影片|