linux 指令碼常用流處理器sed

2021-08-17 23:50:54 字數 4581 閱讀 5143

4. sed options

5. sed script [addresscommand]

5.3 sed address

​ sed 是 linux 下常用的流式文字處理器,將輸入流按行處理,可以滿足大部分場景的文字處理需要。然而第一次使用的時候基本是懵逼的,除了最簡單的 s/a/b/g ,其餘的語法都是似懂非懂,對於稍微複雜一點的場景,就要開啟 [ google->嘗試->不管用->繼續google ] 的大迴圈 =.= 。

​ 搜了一下目前好像還沒有系統的中文 sed 教程,現在抽空從整體上梳理一下 sed 的使用。當然這篇文章參考了 陳皓大神的文章 和 sed 的英文手冊

首先,萬事開頭難,假設你還只是個小白,所以開始要先講一些簡單的東西。如果已經學會了一些技巧請移步下一章。

最簡單的比如,要將 input.txt 中的 「hello」 替換成 「world」,並輸出到 ouput.txt 中,你可以這樣做

sed  's/hello/world/'  input.txt  > output.txt
或者在每一行的前面加內容,可以這樣

sed 's/^/##/g' input.txt
或者在每一行的末尾加內容,可以這樣

sed 's/$/===/g' input.txt
當然,也可以不指定 inputfile,比如使用管道作為輸入流。以下的操作都是等價的

sed 's/hello/world/' input.txt > output.txt

sed 's/hello/world/'

< input.txt > output.txt

cat input.txt | sed 's/hello/world/' > output.txt

#友情提示, world 後面的 / 不能少噢,不然會提示

#sed: -e expression #1, char 13: unterminated `s' command

sed 預設是不會修改原始檔的,如果不想輸出到 output.txt 而是直接在原始檔上修改,使用 -i 選項

sed -i

's/hello/world/' input.txt

預設的 sed 會列印輸出所有處理過的輸入 (除了被修改或被刪除的行) ,可以使用 -n 忽略輸出,並使用 p 來列印特定行

sed -n '1p' input.txt   #只列印第1行
sed 可以同時處理多個檔案,比如列印出第乙個檔案的第一行和最後乙個檔案的最後一行

sed -n '1p ; $p'

1.txt 2.txt 3.txt # $表示最後一行,這裡將會輸出 3.txt 的最後一行

乙個完整的的 sed 命令形式如下,這個公式概括了 sed 幾乎所有的使用形式,主要分為 options ,address,command 三部分。乙個 addresscommand 即是乙個 script

sed [options] 'addresscommand' [inputfile]
options , address, command

這裡還需要重點理解 patternspace 的概念。

patternspace

首先要知道,sed 是按行處理文字流的,即有乙個迴圈每次去讀取一行的資料,這一行的資料會被複製到當前的模式空間(patternspace),然後根據 addresscommand 的規則去處理。所以 patternspace 類似於乙個緩衝區,不斷的將當前行放到緩衝區去處理。

偽**可表示如下:

file}

後面還會講到如何替換patternspace中的資料。

sed 的 options 有一堆,下面只列出了常用的部分, 其餘的暫時還沒用到過…等用到了再補充說明吧

如 2.1 所述,sed 中最重要的就是 address 和 command ,前者用於指定處理範圍,後者指定處理方式。

addresscommand 組合起來就是乙個 script,乙個sed 語句可以包含多個 script,可以通過 -e , -f ,–expression 和 –file 選項來指定。

在上述的標準形式 addresscommand 中,其實還包含另乙個引數,就是command 也可以加引數,完整的形式應該是這個樣子的:

[address]

x[options]

x[options] 合起來表示乙個 command,其中 x 是 sed 中的乙個單個字元,比如 p (列印),d(刪除),q(退出)等等,而 x 後面的[options]表示這個命令可以帶的引數,可帶可不帶,比如 q42 表示退出後返回狀態碼 42

以下用幾個簡單的命令理解一下 [address]x[options] 的含義

# 30,35    address, 指定處理30-35行的資料

# d command, 刪除命令

sed '30,35d' input.txt

# /^foo/ address, 正規表示式,匹配以 foo 開頭的所有行

# q command, 退出命令

# 42 command 的引數,表示返回42的狀態碼

sed '/^foo/q42' input.txt > output.txt

如果是多個 script , 可以用 -e 或者 -f 指定,比如下面的語句都是等價的

# 先刪除以 foo 開頭的所有行,然後將所有行中的 hello 替換為 world

sed '/^foo/d ; s/hello/world/' input.txt

#將多個command 用 -e 表示

sed -e

'/^foo/d'

-e's/hello/world/' input.txt

#指定 script 檔案,執行 script.sed 檔案中的 command

echo

'/^foo/d' > script.sed

echo

's/hello/world/' >> script.sed

sed -f script.sed input.txt

#同時使用-e 和 -f

echo

's/hello/world/' > script2.sed

sed -e

'/^foo/d'

-f script2.sed input.txt

特殊的command s

s 大概是sed 中最重要的命令,因為有非常多的組合操作,所以單獨拿出來講。在文章的開頭已經舉了一些簡單的例子。

's/regexp/replacement/flags'

#當然中間的分割符也可以使用 | 或 @ 或 # 之類的,比如以下都是等價的

's|regexp|replacement|flags'

's@regexp@replacement@flags'

's#regexp#replacement#flags'

道理很簡單,找到所有匹配 regexp 的內容,並替換成 replacement

replacement 中可以包含 \n (n 是1-9 的數字),表示所有匹配結果中的第幾個結果,或者用 & 表示這一行中所有匹配的結果。

字元 / 可以

常用 command

d

刪除當前patternsapce 的內容,並立刻進入下乙個迴圈

不常用command

需要換行的 command

上述命令會將後面的command 也作為文字內容一起處理,這會產生語法上的歧義。

seq 2 | sed '1ahello ; 2d'

1hello ; 2d

2

正確的寫法應該是用 -e 分開,或者換行進行下乙個command

$ seq 2 | sed '1ahello

2d'1

hello

$ seq 2 | sed -e

'1ahello'

-e'2d'

1hello

#(注釋)

注釋會忽略當前行之後的所有內容

r, r, w, w (讀寫檔案的命令)

e (執行命令)

s///[we] (以w 或e 作為flag結尾的s命令)

address 決定了哪些行會被 sed 的command 處理,比如下面的命令只會將第144行的hello替換成world

sed '144s/hello/world/' input.txt
如果 address 為空的話,就會對所有行都用command處理

sed 's/hello/world/' input.txt

流處理器知識概述 什麼是流處理器?

什麼是流處理器 stream processor 在我們介紹流處理器這個概念之前,首先讓我們來了解一下流處理器這個概念是如何演變而來的。早在微軟推出的directx 7.0當中就曾經提出過乙個概念 t l 中文名稱是座標轉換和光源 它幾乎可以看作是流處理器的鼻祖了。不過t l的處理能力相對於現在的顯...

Jmeter常用元件6 後置處理器

1 正規表示式提取器 匹配不同部分的響應資料 響應資料的主體部分 http請求即為body 針對替換了轉義碼的body部分,作為乙個文件的返回內容,只匹配資訊頭部分內容,只匹配url鏈結,響應資訊和響應 引用名稱 匹配出來的資料通過該名稱進行訪問 正規表示式 用該正規表示式進行匹配 模板 選擇用於匹...

Linux控制流 處理器模式與上下文切換

核心模式與使用者模式 處理器需要提供一種機制,限制乙個應用可以執行的指令以及可以訪問的位址空間。處理器通過乙個控制暫存器的模式位來控制當前執行程序的指令執行許可權。設定了模式位 程序處於核心模式,可以執行處理器指令集的全部指令以及訪問任何乙個記憶體位置。未設定模式位 程序處於使用者模式,使用者模式只...