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 表示使用扩展正则表达式


丰木
322 声望19 粉丝

遇见超乎想象的自己!