博客 / 詳情

返回

linux命令之-sed-流編輯命令

1. sed匹配格式

行編輯命令

默認不編輯源文件, 僅對模式空間中的數據(可以理解為一個行緩衝區)做處理, 處理後將模式空間數據顯示到終端

1.1. 始末行匹配: start,end

比如 1,100 指的是從行 [1, 100]

$ 表示最後一行

^ 表示首行

1.2. 正則模式匹配: /regexp/

/^root/ 以root字符串開頭的行

1.3. 始末行模式匹配: /ptn1/,/ptn2/

第一次被 /ptn1/匹配到的行開始, 到第一次被 /ptn2/ 匹配到的行結束

1.4. 精準定位行號: lineNo

匹配行號

1.5. 起始行+長度匹配: start, +n

從start指定的行開始, 到 start+n行結束

2. sed命令

原始文件: vim使用整理.md

[niewj@niewj sf_down]$ cat -n vim使用整理.md 
     1    # vim使用整理
     2    ---
     3    
     4    [TOC]
     5    ---
     6    # vim使用整理.md
     7    
     8    ## 刪除操作
     9    
    10    `dw` 從光標處刪除至詞尾  
    11    `d$` 從光標處刪除至行尾  
    12    `dd ` 刪除整行
    13    
    14    ## 顯示光標位置及文件狀態: `CTRL-g` 
    15    ## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
    16    ​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
    17    ## 查找字符串: `/`
    18    ​    n查找下一個  /Shift-N反向查  /逆向查?代替/  
    19    
    20    ## 查找替換`:s/old/new/g` 替換old為new  
    21    ## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
    22    ​    (#,#代表的是兩行的行號)
    23    ​    :%s/old/new/g 替換全文  
    24    ​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
    25    ​    
    26    `:!` 執行外部命令  
    27    `:w` FILENAME改動保存到文件  
    28    `:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
    29    `:r FILENAME` 插入外文件內容-->從光標處置入  
    30    ## 插入模式  
[niewj@niewj sf_down]$ 

2.0 sed命令一覽(''中的部分)

1. 刪除行: d

2. 顯示行: p

3. 前追加行: a "string": 行後加行, 內容string

4. 前追加行: i "string": 行前加行, 內容string

a i 中可以用 n 增加換行

5. 後追加文件讀: r fname: 行後加入文件fname中的全部內容

就是把fname中的內容全部讀取出來, 加入到匹配行; 比如 :

sed '2r a.txt' cuur.txt 就是把 a.txt 文件內容全讀出來, 最為一個整體, 顯示到屏幕的時候, 追加到第2行的下面(從第3行開始顯示a.txt的內容, 原來的第三行, 跟到文件a.txt輸入完成後!)

特殊用法->合併文件: 把一個文件追加到另一個的末尾

6. 抽取另存: w fname

將匹配的所有行內容另存到一個文件 fname 中

下面對此文件做操作

7. 查找替換: s///(s三斜線): s/ptn/str/[g|i]

ptn 是模式, 可以用普通字符串, 也可以用正則

str是替換成的字符串;

  1. 修飾符: g=全局替換; 因為默認是指替換 每行第一個匹配到的, 如果一行中有多個匹配到,全部要替換, 就加g global
  2. 修飾符: i=忽略大小寫 ignore sensitive

s/// s### s@@@ 都可以, 不是必須用 /的; 如果使用了# , 匹配/就不需要轉義了;

8. s///中使用:模式引用& (&就指代pattern匹配的字符串)

s/pattern/string/[g|i] > 模式就是pattern在每行能匹配到的部分, 比如:

s@follow@with@g 這裏的 follow 就是模式, 匹配到某行中

follow me follow us

fellow me fellow us

就會替換為:

with me with us

fellow me fellow us

使用模式引用, 在每個匹配到的後面都加 er 可以更靈活:

s@f....w@&er@g 這樣替換就變成了:

follower me follower us

fellower me fellower us

9. s///中使用: 後向引用 \1

比如我們匹配到的pattern用()括起來分組, 在後面替換的部分用 \1 來編號引用它, 比如我們要匹配:

validation volatile vocation 等把這些單詞用 <font color=red></font>給包圍起來:

sed 's/(v.ti.[s|t])/<font color='red'> 1 </font>/g'

2.1. 刪除匹配的行: d

2.1.1. 刪除 start,stop-> 第1行到第19行: sed '1,19d'

[niewj@niewj sf_down]$ sed '1,19d' vim使用整理.md 
## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
[niewj@niewj sf_down]$ 

2.1.2. 刪除start,$->22行到末行: sed '22,$d'

[niewj@niewj sf_down]$ sed '22,$d' vim使用整理.md
# vim使用整理
---

[TOC]
---
# vim使用整理.md

## 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
[niewj@niewj sf_down]$ 

2.1.3. 刪除start,+len->前13行另一種方法: sed '1,+12d'

[niewj@niewj sf_down]$ sed '1,+12d' vim使用整理.md 
## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
[niewj@niewj sf_down]$ 

2.1.4. 刪除指定行->只刪除第4行: sed '4d'

[niewj@niewj sf_down]$ sed '4d' vim使用整理.md 
# vim使用整理
---

---
# vim使用整理.md

## 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
[niewj@niewj sf_down]$
[TOC]所在行被刪除

2.1.5. 刪除包含#的行: sed '/#/d' vim使用整理.md

/開始 /結束 中間是匹配模式
[niewj@niewj sf_down]$ sed '/#/d' vim使用整理.md 
---

[TOC]
---


`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:r FILENAME` 插入外文件內容-->從光標處置入  
[niewj@niewj sf_down]$

2.1.6. 刪除包含特殊字符的行->刪除包含 / 的行: sed '/\//d'

[niewj@niewj sf_down]$ sed '/\//d' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

## 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行

​    (#,#代表的是兩行的行號)
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
[niewj@niewj sf_down]$

2.1.7. 始末行都使用模式->刪除:第一個#開頭行到25行: sed '/^#/,25d'

[niewj@niewj sf_down]$ sed '/^#/,25d' vim使用整理.md 
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
[niewj@niewj sf_down]$

2.2. 顯示匹配的行: p

明確一個概念: sed命令默認顯示 模式空間 中的內容; 而 p 是過濾匹配的行顯示;

這樣一來, sed + p 就會使得 匹配的內容 顯示兩次;

我們可以使用 sed的 -n 靜默模式, 使得不顯示模式空間中的內容, 只輸出 p 匹配的內容

2.2.1. 不使用靜默模式 -n -> 顯示包含#的行: sed '/#/p'

[niewj@niewj sf_down]$ sed '/#/p' vim使用整理.md 
# vim使用整理
# vim使用整理
---

[TOC]
---
# vim使用整理.md
# vim使用整理.md

## 刪除操作
## 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
## 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
## 插入模式  
[niewj@niewj sf_down]$

2.2.2. 使用靜默模式 -n -> 顯示包含#的行: sed -n '/#/p'

[niewj@niewj sf_down]$ sed -n '/#/p' vim使用整理.md 
# vim使用整理
# vim使用整理.md
## 刪除操作
## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
## 查找字符串: `/`
## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。 
​    (#,#代表的是兩行的行號)
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
## 插入模式  
[niewj@niewj sf_down]$

2.2.3. 靜默模式 -n -> 顯示#開頭的行: sed -n /^#/p

[niewj@niewj sf_down]$ sed -n '/^#/p' vim使用整理.md 
# vim使用整理
# vim使用整理.md
## 刪除操作
## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
## 查找字符串: `/`
## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。 
## 插入模式  
[niewj@niewj sf_down]$

2.3. 匹配的行後追加字符串: a

2.3.1 後追加行: #開頭的行後加1行"---": sed '/^#/a \---'

[niewj@niewj sf_down]$ sed '/^#/a \---' vim使用整理.md 
# vim使用整理
---
---

[TOC]
---
# vim使用整理.md
---

## 刪除操作
---

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
---
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
---
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
---
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
---
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
---
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
---
[niewj@niewj sf_down]$ 

2.3.2 後追加行: ##開頭的行後加2行"---": sed '/^##/a \---\n---'

[niewj@niewj sf_down]$ sed '/^##/a \---\n---' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

## 刪除操作
---
---

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
---
---
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
---
---
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
---
---
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
---
---
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
---
---
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
---
---
[niewj@niewj sf_down]$
n 可以轉義

2.4. 匹配的行後追加字符串: i

2.4.1 前追加行: #開頭的行前加1行"---": sed '/^#/i \---'

[niewj@niewj sf_down]$ sed '/^#/i \---' vim使用整理.md 
---
# vim使用整理
---

[TOC]
---
---
# vim使用整理.md

---
## 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

---
## 顯示光標位置及文件狀態: `CTRL-g` 
---
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
---
## 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

---
## 查找替換`:s/old/new/g` 替換old為new  
---
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
---
## 插入模式  
[niewj@niewj sf_down]$

2.5. 匹配的行後追加文件內容: r

2.5.1 後追加文件: #開頭的行後追加文件內容

預備: 我們新建一個moon.txt文件, 把徐志摩的兩個月亮的一部分填進去, 後邊用於顯示追加;

echo -e "我望見有兩個月亮:\n一般的樣,不同的相。\n一個這時正在天上\n披敝著雀的衣裳;\n她不吝惜她的恩情,\n滿地全是她的金銀。\n她不忘故.的琉璃,\n三海間有她的清麗。\n她跳出雲頭,跳上樹,\n又躲進新綠的藤蘿。">moon.txt

需求: 在每個 "##" 開頭的行後面貼上 moon.txt的全文:

[niewj@niewj sf_down]$ sed '/^##/r moon.txt' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

## 刪除操作
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。
[niewj@niewj sf_down]$

2.5.2 特殊用法->合併文件: 把一個文件追加到另一個的末尾

[niewj@niewj sf_down]$ sed '$r moon.txt' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

## 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
我望見有兩個月亮:
一般的樣,不同的相。
一個這時正在天上
披敝著雀的衣裳;
她不吝惜她的恩情,
滿地全是她的金銀。
她不忘故宮的琉璃,
三海間有她的清麗。
她跳出雲頭,跳上樹,
又躲進新綠的藤蘿。
[niewj@niewj sf_down]$

2.6 抽取另存->匹配的行內容另存到文件

sed -n '/^##/w comment.txt'
[niewj@niewj sf_down]$ sed -n '/^##/w comment.txt' vim使用整理.md 
[niewj@niewj sf_down]$ cat comment.txt 
## 刪除操作
## 顯示光標位置及文件狀態: `CTRL-g` 
## 跳轉到文件中的某一指定行: `n+SHIFT-G` 
## 查找字符串: `/`
## 查找替換`:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
## 插入模式  
[niewj@niewj sf_down]$ 

2.7 查找並替換 s///

2.7.1. 替換所有行首##改成//: sed 's/^##/\///'

[niewj@niewj sf_down]$ sed 's/^##/\/\//' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

// 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

// 顯示光標位置及文件狀態: `CTRL-g` 
// 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
// 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

// 查找替換`:s/old/new/g` 替換old為new  
// 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
// 插入模式  
[niewj@niewj sf_down]$

2.7.2. 替換所有行首##改成//: sed 's@^##@//@'

sed 's/^##////' vim使用整理.md 使用的是 /, 其實也可以用其他的, 比如這裏使用 @ 比較好:

sed 's@^##@//@' vim使用整理.md 不用轉義 / , 多方便

[niewj@niewj sf_down]$ sed 's@^##@//@' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

// 刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

// 顯示光標位置及文件狀態: `CTRL-g` 
// 跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
// 查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

// 查找替換`:s/old/new/g` 替換old為new  
// 替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
// 插入模式  
[niewj@niewj sf_down]$

2.7.3. 全局替換g

2.7.3.1 默認: 每行只匹配第一次, 如: 查找每行的 ` 並提換為~
[niewj@niewj sf_down]$ sed 's/`/~/' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

## 刪除操作

~dw` 從光標處刪除至詞尾  
~d$` 從光標處刪除至行尾  
~dd ` 刪除整行

## 顯示光標位置及文件狀態: ~CTRL-g` 
## 跳轉到文件中的某一指定行: ~n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: ~/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換~:s/old/new/g` 替換old為new  
## 替換兩行間出現的每個匹配串~:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
~:!` 執行外部命令  
~:w` FILENAME改動保存到文件  
~:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
~:r FILENAME` 插入外文件內容-->從光標處置入  
## 插入模式  
[niewj@niewj sf_down]$
2.7.3.2 使用全局替換: g
[niewj@niewj sf_down]$ sed 's/`/~/g' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

## 刪除操作

~dw~ 從光標處刪除至詞尾  
~d$~ 從光標處刪除至行尾  
~dd ~ 刪除整行

## 顯示光標位置及文件狀態: ~CTRL-g~ 
## 跳轉到文件中的某一指定行: ~n+SHIFT-G~ 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
## 查找字符串: ~/~
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

## 查找替換~:s/old/new/g~ 替換old為new  
## 替換兩行間出現的每個匹配串~:#,#s/old/new/g~ 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
~:!~ 執行外部命令  
~:w~ FILENAME改動保存到文件  
~:#,# w FILENAME~ ** 保存部分內容;#,#行號(頂行,底行)  
~:r FILENAME~ 插入外文件內容-->從光標處置入  
## 插入模式  
[niewj@niewj sf_down]$

2.8 s///使用模式引用&: 引用匹配部分原值

[niewj@niewj sf_down]$ sed 's/^##/&@@ /g' vim使用整理.md 
# vim使用整理
---

[TOC]
---
# vim使用整理.md

##@@  刪除操作

`dw` 從光標處刪除至詞尾  
`d$` 從光標處刪除至行尾  
`dd ` 刪除整行

##@@  顯示光標位置及文件狀態: `CTRL-g` 
##@@  跳轉到文件中的某一指定行: `n+SHIFT-G` 
​    n:數字,代表行號, 省略的話, 默認跳轉到最後一行
##@@  查找字符串: `/`
​    n查找下一個  /Shift-N反向查  /逆向查?代替/  

##@@  查找替換`:s/old/new/g` 替換old為new  
##@@  替換兩行間出現的每個匹配串`:#,#s/old/new/g` 替換兩行間出現的每個匹配串(#,#代表的是兩行的行號)。  
​    (#,#代表的是兩行的行號)
​    :%s/old/new/g 替換全文  
​    :%s/old/new/gc全文替換時確認每次替換--添加 c   
​    
`:!` 執行外部命令  
`:w` FILENAME改動保存到文件  
`:#,# w FILENAME` ** 保存部分內容;#,#行號(頂行,底行)  
`:r FILENAME` 插入外文件內容-->從光標處置入  
##@@  插入模式  
[niewj@niewj sf_down]$

2.9 s///後向引用: 引用匹配分組原值 \1

有文本文件 test:

[niewj@niewj sf_down]$ cat -n test 
     1    vacation    假期
     2    vocation    職業
     3    validation    n. 確認;批准;生效
     4    volatile    易變的
     5    apt    恰當的
     6    opt    選擇
     7    assess    評估
     8    access    接近
     9    explore    探索
    10    exploit    利用
    11    follow me follow us
    12    fellow me fellow us
[niewj@niewj sf_down]$

2.9.1 匹配 v開頭且包含ti的單詞, 用 <font></font>包裹起來:

前四行都有 v*ti* 我們的需求就是: 匹配 v開頭且包含ti的單詞, 用 <font></font>包裹起來:

[niewj@niewj ]$ sed 's/\(v.*ti.*[\s|\t]\)/\<font color='red'\> \1 \<\/font\>/g' test
<font color=red> vacation     </font>假期
<font color=red> vocation     </font>職業
<font color=red> validation     </font>n. 確認;批准;生效
<font color=red> volatile     </font>易變的
apt    恰當的
opt    選擇
assess    評估
access    接近
explore    探索
exploit    利用
follow me follow us
fellow me fellow us
[niewj@niewj sf_down]$

sed 's/(v.ti.[s|t])/<font color='red'> 1 </font>/g' s///的三部分分析:

  1. s/pattern/

    (v.*ti.*[s|t]) (1). 匹配v開頭中間包含ti 後面是 空格或tab鍵的模式;

  2. s/pattern/\<font color='red'\> 1 \</font\>/

    \1 就是引用上面的模式, 用括號括起來的 () 在實際文本行中匹配到什麼, 替換的字符串, 照舊貼上!!

  3. /g 全局替換(默認是指匹配每行第一次匹配, 不過此處無所謂, 因為每行只有一次匹配)

2.9.2 匹配 v開頭且包含ti的單詞, 修改: 只把首字母v變大寫V:

其實後項引用真正強大的就是部分引用, 上面的例子不能説明;

[niewj@niewj sf_down]$ sed 's/v\(.*ti.*[\s|\t]\)/V\1/g' test 
Vacation    假期
Vocation    職業
Validation    n. 確認;批准;生效
Volatile    易變的
apt    恰當的
opt    選擇
assess    評估
access    接近
explore    探索
exploit    利用
follow me follow us
fellow me fellow us
[niewj@niewj sf_down]$

()作為一個分組, 後面可以用1 保留, 只替換v->V即可

v\(.*ti.*[\s|\t]\) 分成兩部分了:
v -> 後面替換V的
()->\1  來引用保留的

3. sed命令option

-n 靜默模式, 模式空間中的內容不會顯示出來;

-i 直接修改源文件(默認是不修改源文件的)

-e 同時執行多個小腳本: 每次是執行一條腳本, -e這樣可以執行多條: -e script_1 -e script_2

-f 多個腳本可以放到一個文件中, 每行方一條; sed -f script_file target_file

-r 表示使用擴展正則表達式

user avatar dm2box 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.