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