文本三剑客之 sed 编辑器

一.sed 概述

1.sed 介绍

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个

命令文本文件中。

2.sed 的工作流程

读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

3.常用的选项

-e    或--expression=:表示用指定命令来处理输入的文本文件,
               只有一个操作命令时可省略,一般在执行多个操作命令使用

-f    或--file=:表示用指定的脚本文件来处理输入的文本文件。

-h    或--help:显示帮助。

-n    --quiet 或 silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
                                              p 打印功能

-i    直接修改目标文本文件。

4.命令格式

sed -e '操作命令' 目标文件 ....      #在命令行指定操作命令处理文件行数据

sed -e '操作' 文件1 文件2    ...

sed -n -e '操作' 文件1 文件2 ...

sed -f 脚本文件 文件1 文件2  ...

sed -i -e '操作' 文件1 文件2 ...

sed -e 'n{
操作1
操作2
...
}' 文件1 文件2 ...

二.sed 的常用操作

s:替换,替换指定字符。

d:删除,删除选定的行。

a:增加,在当前行下面增加一行指定内容。

i:插入,在选定行上面插入一行指定内容。

c:替换,将选定行替换为指定内容。

y:字符转换,转换前后的字符长度必须相同。

p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;
如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。

=:打印行号。

l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

1.打印内容功能

(1)sed  的 p 选项

打印内容   p(打印行内容)  =(打印行号)   l(打印ASCII字符)

(2)打印指定的地址

sed编辑器有2种寻址方式:
【1】以数字形式表示行区间
【2】用文本模式来过滤出行

sed -n -e 'n;p' test1.txt  的演示过程

第一次过程  读取  第一行   执行  先n  跳到到下一行  (第二行)   再p  打印第二行内容

第二次过程  读取  第三行   执行  先n  跳到到下一行  (第四行)   再p  打印第四行内容

第三次过程  读取  第五行   执行  先n  跳到到下一行  (第六行)   再p  打印第六行内容

sed -n -e '2,${n;p}' test1.txt
第一次过程   读取  第二行    执行 先n   跳到下一行 (第三行)     再p 打印第三行内容 
第二次过程   读取  第四行    执行 先n   跳到下一行 (第五行)     再p 打印第五行内容 
第三次过程   读取  第六行    执行 先n   跳到下一行 (第七行)     再p 打印第七行内容 

 sed 默认只支持默认正则表达式使用,想要使用扩展表达式需要加上 - r  选项

联合使用

2. 删除功能

sed 的 的选项

 拓展:在一个脚本文件里定义操作命令

sed -f 脚本文件  目标文件 ....                    

使用指定脚本文件里的操作命令处理文件行数据

提前在文件里定义一个操作可以指定文件加上 - f 选项进行操作处理;也可以进行多行操作。

vim a.sh

p;n

 vim a.txt

=

p;n

 拓展2:sed -i

3.替换功能

替换    s(字符串替换)    c(整行内容替换)     y(对应字符替换)

行范围 s/旧字符串/新字符串/替换标记

4种替换标记:
数字:     表明新字符串将替换第几处匹配的地方
g:           表明新字符串将会替换所有匹配的地方
p:           打印与替换命令匹配的行,与-n一起使用
w 文件:  将替换的结果写到文件中

如果想要删除root字符

如果想要删除 /etc/yum.conf 文件里的第15行到第26行删除注释

如果想要/etc/yum.conf 文件里第1行到第12行加上注释

如果想要只注释 /etc/fstab 文件里的 swap

如果想要给编辑的文件新保存;可以使用重定向输出的方式,也可以通过sed 命令 w 操作来保存,不过只会保存修改的内容

 sed  's/.*swap.*/#&/w /opt/fstab2' /etc/fstab

拓展:/ 可以被替换

sed -e 's/\bin\/bash/\/sbin\/nologin/g' /etc/passwd

sed -e 's#bin/bash#/sbin/nologin#g' /etc/passwd
 
     两者效果一样, /  可以替换成任意符号都可以做到替代\的作用
sed 's9\945\9\99\98\939g' test.txt   的含义

          将\954\9\9 替换成 \98\93

替换的高级功能

sed -e '行号c 新行内容'
sed -e '/字符串/c 新行内容'

sed -e 'y/旧字符/新字符/' 

4.插入功能

a(在指定行下面插入行内容)

i(在指定行上面插入行内容)

r(在指定行下面插入整个文件内容)

sed -e '行号区间a 行内容'
sed -r -e '/字符串或正则/a 行内容'

sed -e '行号区间i 行内容'
sed -r -e '/字符串或正则/i 行内容'

sed -e '行号区间r 文件'

读入文件内容

5.复制粘贴功能

 H(复制指定行到剪切板)    G(将剪切板内容粘贴到指定行下面)

sed -e '1,3H;$G'           #将1-3行内容复制粘贴到最后一行下面

sed -e '1,3{H;d};$G'       #将1-3行内容剪切粘贴到最后一行下面

 拓展:将echo 11122233 替换成 321321321;将每个字符用()括起来重新用 \ 分配位置即可

### 关于 Sed 的使用教程 Sed(Stream Editor)是一个功能强大的流编辑器,广泛应用于 Linux 和 Unix 系统中。它可以高效地完成多种文本处理任务,例如查找、替换、删除以及格式化文本等操作[^1]。 #### 基本语法结构 Sed 的基本语法如下所示: ```bash sed [选项] '地址范围 操作命令' 文件名 ``` - **选项**:常用的选项包括 `-n` 表示只打印经过 `p` 命令处理的内容;`-e` 可以指定多条命令;`-f` 从脚本文件加载命令;`-i` 实现原地修改文件内容。 - **地址范围**:可以是具体的行号或者通过正则表达式匹配的模式。 - **操作命令**:常见的有替换 (`s`)、删除 (`d`)、插入 (`i`) 和追加 (`a`) 等。 --- #### 替换操作 (s 命令) `s` 命令是最常使用的命令之一,用于将特定文本替换为其他文本。其通用形式为: ```bash sed 's/pattern/replacement/flags' ``` - `pattern`: 被替换的目标字符串或正则表达式。 - `replacement`: 新的替代字符串。 - `flags`: 控制行为的标志位,比如 `g` 表示全局替换,`i` 忽略大小写。 ##### 示例代码 假设有一个名为 `example.txt` 的文件,内容如下: ``` hello world error found here another error line ``` 以下是几个典型的替换例子: ```bash # 将所有的 "error" 替换为 "warning" sed 's/error/warning/g' example.txt # 输出结果: # hello world # warning found here # another warning line ``` 如果只想替换每行的第一个匹配项,则省略 `/g` 参数: ```bash sed 's/error/warning/' example.txt # 输出结果: # hello world # warning found here # another error line ``` 还可以利用反向引用捕获分组并重新排列它们: ```bash echo "John Smith" | sed 's/\(.*\), \(.*\)/\2 \1/' # 输入:"Smith, John" # 输出:"John Smith" ``` --- #### 删除操作 (d 命令) `d` 命令用于删除满足条件的行。例如,删除包含某个关键字的所有行: ```bash sed '/pattern/d' 文件名 ``` ##### 示例代码 继续以上述 `example.txt` 文件为例: ```bash # 删除包含 "error" 的所有行 sed '/error/d' example.txt # 输出结果: # hello world ``` 也可以按照行号来删除某一行或多行: ```bash sed '2d' example.txt # 删除第 2 行 sed '2,3d' example.txt # 删除第 2 到第 3 行 ``` --- #### 插入与附加操作 (i/a 命令) - `i` 命令在指定位置之前插入新行。 - `a` 命令在指定位置之后附加新行。 ##### 示例代码 ```bash # 在第二行前插入一条消息 sed '2i This is an inserted line.' example.txt # 输出结果: # hello world # This is an inserted line. # error found here # another error line ``` 对于追加操作: ```bash sed '2a Appended after the second line.' example.txt # 输出结果: # hello world # error found here # Appended after the second line. # another error line ``` --- #### 组合多个命令 可以通过分号 `;` 连接多个命令,在单次调用中完成复杂任务。例如: ```bash sed -e 's/error/warning/g' -e '$ a End of file message' example.txt ``` 上述命令先将所有 `error` 替换为 `warning`,再在最后一行后面追加一段文字。 --- #### 原地编辑 (-i 选项) 当希望直接修改源文件而非仅显示改动时,可启用 `-i` 参数。例如: ```bash sed -i 's/error/warning/g' example.txt ``` 这会永久保存对 `example.txt` 的更改。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值