Unix / Linux - Regular Expressions with SED

您好,未來的命令行法師!今天,我們將深入正則表達式(regex)和Unix/Linux中強大的SED命令的神奇世界。請系好安全帶,因為我們即將踏上讓您 manipulating 文本的方式徹底改觀的驚險冒險!

Unix / Linux - Regular Expressions

呼叫 sed

讓我們從基礎開始。SED,全稱為 "Stream Editor",是一個強大的文本處理工具。使用它時,我們只需簡單地輸入 "sed" 加上我們的命令。這就像呼唤一個文本操作的精靈!

sed 'command' filename

例如:

sed 's/hello/bonjour/' greetings.txt

這個命令將文件 greetings.txt 中的 "hello" 替換為 "bonjour"。簡單吧?

sed 的一般語法

sed 的一般語法就像一個魔法咒語:

sed OPTIONS... [SCRIPT] [INPUTFILE...]

別擔心這看起來令人生畏。我們會一點一滴地拆解它,就像解開一個有趣的謎題!

使用 sed 刪除所有行

想要讓文件中的所有文本消失?sed 可以做到!這樣操作:

sed 'd' filename

這會刪除文件中的所有行。這就像在您的數字筆記本上使用橡皮擦!

sed 的地址

sed 的地址就像文本的 GPS 坐標。它告訴 sed 在哪裡施展它的魔法。以下是一些例子:

sed '2d' file.txt  # 刪除第 2 行
sed '/pattern/d' file.txt  # 刪除包含 'pattern' 的行

sed 的地址範圍

有時候,我們想在一系列行上施法。這樣操作:

sed '2,5d' file.txt  # 刪除第 2 到第 5 行
sed '2,$d' file.txt  # 刪除從第 2 行到文件結尾

替換命令

替換命令是 sed 的核心。它就像 "查找和替換" 的強化版!

sed 's/old/new/' file.txt

這將在每行上替換第一個出現的 "old" 為 "new"。

替換標誌

標誌就像替換命令的增強道具。以下是一些常見的標誌:

標誌 描述
g 替換所有出現,而不僅是第一個
i 忽略大小寫
p 打印更改後的行
w 將結果寫入文件

示例:

sed 's/cat/dog/g' pets.txt

這將替換 "cat" 的所有出現為 "dog"。

使用替換字符串分隔符

有時候,您的文本中含有許多斜杠。別擔心!我們可以使用不同的分隔符:

sed 's#/usr/local/bin#/common/bin#' paths.txt

在這裡,我們使用 '#' 作為分隔符而不是 '/'。

使用空格替換

想要讓文本無蹤跡地消失?這樣操作:

sed 's/unwanted//g' file.txt

這將從文件中刪除所有 "unwanted" 的出現。

地址替換

我們可以將地址與替換結合起來,進行精確的文本手術:

sed '3,6s/foo/bar/g' file.txt

這將替換第 3 到第 6 行上的所有 "foo" 為 "bar"。

匹配命令

匹配命令就像一個聚光燈,照亮我們感興趣的行:

sed -n '/pattern/p' file.txt

這將打印只包含 "pattern" 的行。

使用正則表達式

現在我們來到真正的魔法!正則表達式就像通配符的強化版。以下是一個簡單的例子:

sed -n '/^The/p' story.txt

這將打印所有以 "The" 開頭的行。

匹配字符

正則表達式有特殊的字符,它們像變形者:

字符 含義
. 任何單個字符
* 前一個字符的零個或多個
^ 行的開頭
$ 行的結尾

示例:

sed -n '/c.t/p' animals.txt

這將匹配 "cat"、"cot"、"cut" 等。

字符類別關鍵字

字符類別就像字符的團隊。以下是一些 MVP 球員:

類別 匹配
[:alpha:] 字母字符
[:digit:] 數字字符
[:alnum:] 字母數字字符

示例:

sed -n '/[[:digit:]]/p' data.txt

這將打印包含任何數字的行。

參考與引用

與號 (&) 就像一個魔法鏡子,反映匹配的內容:

sed 's/[0-9]/(&)/' numbers.txt

這將在每個數字周圍加上括號。

使用多個 sed 命令

想要一次施放多個咒語?使用 -e 選項:

sed -e 's/foo/bar/g' -e 's/baz/qux/g' file.txt

這將一次性執行兩個替換!

反向引用

反向引用就像時間機器,讓我們重用匹配的部分:

sed 's/\(.*\):\([^:]*\)/\2:\1/' names.txt

這將交換冒號前後的文本。

以上就是全部内容,我親愛的學生們!我們一起穿越了 sed 和正則表達式的土地。記住,熟能生巧。所以,勇往直前,像正在成為的命令行法師那樣 manipulating 文本吧!祝您編程愉快!

Credits: Image by storyset