1. 程式人生 > >sed的常用語法總結及示例

sed的常用語法總結及示例

Sed的基本用法

概念及作用

sed和grep類似,也是一種檔案編輯器 sed是一個流編輯器,所謂流編輯器是指sed每次只從檔案或stdin中讀入一行,將讀入的行儲存至模式空間然後根據指定的要求對其進行處理,並將處理後的結果輸出至螢幕,接著讀入下一行,整個文字的過程如流水線般被逐行處理後輸出。 sed主要用來自動編輯一個或多個檔案,可以將資料進行增刪改查等特定工作,簡化對檔案的反覆操作.

格式

sed [引數] ‘命令’ 檔案

引數

-f :將sed的動作寫在一個檔案內,用–f filename 執行filename內的sed動作; -i :直接修改檔案內容,(沒有備份時慎重操作); -n :只打印模式匹配的行,與grep相似 -r :支援擴充套件表示式;

命令

a\ 在當前行下面插入文字; i\ 在當前行上面插入文字; c\ 把當前行改為新的文字; d 刪除,將選擇的內容刪除 D 刪除模板第一行 s 替換指定字元 (最常用) p 列印模板塊的行。(常常和 -n配合使用) P 列印模板塊的第一行;

標記

g 表示行內全部替換,ng表示第n個匹配的開始進行替換 w 表示把行寫入一個檔案 \1 字串匹配標記(劃重點) & 已匹配字串標記

部分測試

1. 替換

echo book | sed 's/book/books/' 將book替換為books

在這裡插入圖片描述

先將777和test寫入到cs檔案中,然後使用 sed命令將test替換為TEST,再用-n p 組合檢視 sed 's/test/TEST/' cs

sed -n 's/test/TEST/p' cs

在這裡插入圖片描述 可以看到,通過使用-n p 執行sed之後就只顯示經過修改的結果.

2. 全域性替換

echo sksksksksksk | sed 's/sk/SK/ng'

在這裡插入圖片描述這裡能看出g的作用, 當n=1時,這段程式碼就是將每一個sk替換為SK, 為2時,從第二個開始的sk換為SK 以此類推 ng就是從第n個開始,將字元進行替換

3. 刪除

拷貝一份passwd,新增幾個空行

在這裡插入圖片描述

sed '/^$/d' passwd | head -10 刪除空白行

在這裡插入圖片描述

接著對沒有空白行的文字進行操作 刪除第二行 sed '2d' passwd

在這裡插入圖片描述

sed '2,$d' passwd

刪除第二行之後的所有(包括第二行)

在這裡插入圖片描述 從這裡可以發現’n,md’是刪除n-m行(包括n和m)

字串標記

在正則中,用\w\+匹配每一個單詞 在sed中,&則表示匹配到的字元 echo "this is a test line" | sed 's/\w\+/[&]/g'

在這裡插入圖片描述這個命令用來給匹配到的每一個單詞加上[]

子串匹配(重點)

我們假定a b c d 為一個字串,那麼a b c d 則為 a b c d的四個子串 在搞懂這個概念之後,進行如下命令 echo a b c d | sed 's/\([a-z]\) \([a-z]\) \([a-z]\) \([a-z]\)/\4/'

在這裡插入圖片描述 這一段命令是分別匹配了a b c d的四個子串,然後輸出第四個子串

echo a b c d | sed 's/\([a-z]\) \([a-z]\) \([a-z]\) \([a-z]\)/\4\3\2\1/'

在這裡插入圖片描述而這一段命令則是將匹配的子串倒序輸出,且中間沒有隔斷

echo a b c d | sed 's/\([a-z]\) \([a-z]\) \([a-z]\) \([a-z]\)/\4,\3,\2,\1/'

在這裡插入圖片描述這一段則是用’,'隔開

對子串進行一個剖析

在這裡插入圖片描述這後面的\4\3\2\1分別對應子串4,子串3 ,子串2,子串1

另外,子串的匹配方式應和原文字保持一致,不然會匹配不到

選定範圍

在sed中,範圍的用’,(逗號)’ 例如我們前面的刪除第二行之後的所有就用了2-$($和以前一樣,表示結尾,同樣^和以前一樣表示開頭) 在passwd中新增一行test 在這裡插入圖片描述 列印從第5行開始一直到第一個以test開頭的行之間的所有內容 sed -n '5,/^test/p' passwd

在這裡插入圖片描述

追加

追加分為行上(a),行下(i),本行

行上追加

就是在匹配到的行前面一行進行追加操作 sed '/^test/i\777' passwd

在這裡插入圖片描述在以test開頭的行前追加 ‘777’

行下追加

在匹配到的行下面一行進行追加 sed '/^test/a\777' passwd

在這裡插入圖片描述這裡是在以test開頭的行下面一行追加777

本行追加

本行追加又有在匹配到的字元後直接追加和在行尾追加兩種

  • 字元後追加 sed 's/^test/&777/' passwd

在這裡插入圖片描述這裡使用了&代表匹配到的test

  • 在行末追加 sed '/test/s/$/777/' passwd

在這裡插入圖片描述 這裡是先對test匹配,然後在末尾使用替換命令,就可以完成在行末追加內容的操作

各種正則也適用於sed表示式 sed主要用於檔案的行處理,列處理我們常用的是awk,後面還會對awk進行學習