sed命令——容易上手而又方便实用的文本编辑命令

什么是sed命令

sed命令,是一个功能非常强大的文本编辑命令,也是一个流编辑器,虽然它是非交互式的编辑器,但通过它自带的文本编辑命令,可以轻松方便的去编辑文本。

sed命令的执行流程

sed命令,首先它把要读取文件的每一行数据读取到缓存区中,然后,如果没有-n选项,就在匹配模式前输出文件中读取到的每一行数据 ,之后与读取到的数据跟sed文本编辑命令前的匹配模式进行匹配,如果匹配成功,就执行sed文本编辑命令,否则原样输出,之后继续读取文件下一行,直到文件全部读完为止。用流程图表示就是这样:

flowchart subgraph 文件 text\ntxet\naaaa end 文件-->|读取每一行数据到缓存区|a{如果没有-n选项}-->|是|b[/输出文件每一行数据/]-->c{如果读取到的数据与sed命令前的匹配模式匹配成功}-->|是|执行sed文本编辑命令-->d["读取下一行,读完文件就结束"]-->|读取|文件 a-->|否|c-->|否|原样输出-->d

怎样写sed命令

sed命令,他是这样写的:

bash 复制代码
sed [选项] (模式匹配/sed的文本编辑命令) 文件...

其中,省略号表示前面的东西可以有多个,而sed的文本编辑命令这里先不谈。

sed的文本编辑命令的语法

要想熟练地运用sed,最要学会的就是先要掌握它的文本编辑命令及语法,把它学会了,你离sed命令的熟练运用也就不远了。在sed的文本编辑命令中,基础命令有以下几个:

命令 用途 方便记住的技巧 说明
a 在行后添加命令后面的字符串 a = append
c 改变行的内容 c = change
d 删除行 d = delete
i 在行前添加命令后面的字符串 i = insert
n 跳到下一行 n = \n
p 输出读取到的行 p = print
s 把需要匹配的字符串交换成需要交换的字符串 s = swap 并且s命令有两个参数,用/分隔,且第一个参数的前面和第二个后面都有/
= 输出行数

除此之外,还有一些特殊的操作符。

特殊操作符 用途 方便记住的技巧
! 匹配条件取反,写在匹配模式的后面 ! = 编程语言中的!
; 分割多个命令 ; = 编程语言中的;
{} 将多个命令合为一组,前面可以有匹配模式 {} = 编程语言中的代码块 -> 命令块

而在这之后,就要先认识一下sed命令的还有一个我没介绍过的区,就是临时区,临时区,顾名思义就是临时的区,默认只有一个\n,通过刚才介绍过的缓存区和临时区,用户可以更加轻松方便的使用sed命令编辑文本。

那么,我们该如何操控sed命令的缓存区和临时区呢?就要学到下面的区块命令了。

命令 用途
g 临时区 的内容重写缓存区的内容
G 临时区 的内容追加缓存区的内容
h 缓存区 的内容重写临时区的内容
H 缓存区 的内容追加临时区的内容
x 交换两个区的内容

命令学到了,就要继续学一下sed文本编辑命令的语法了,sed文本编辑命令的语法是这样的:

bash 复制代码
(匹配模式)(命令)(参数)
# 这里的括号实际不用写,只是便于理解罢了,

其中,我们就先以添加新行的sed文本编辑命令ai为起点,并以下面的文本文件t.txt作为示例,开始看sed文本编辑命令的实践吧。

bash 复制代码
#!/bin/bash
if [ -e $1 ]
then
        echo had
        exit
fi
if [ 0 == $# ]
then
        echo error
        exit 1
fi
touch $1
chmod +x $1
echo "#!/bin/bash" > $1
vim $1

添加新行的sed文本编辑命令------a, i

1. 往第一行后面添加echo start

bash 复制代码
sed '1aecho start' t.txt

2. 往最后一行后面添加echo end

bash 复制代码
sed '$aecho end' t.txt

3. 往第十一行后面添加# touch file

bash 复制代码
sed '11a# touch file' t.txt

4. 往带字符c的行的后面添加# had char 'c' ^

bash 复制代码
sed '/c/a# had char 'c' ^' t.txt

5. 往第一行前面插入# start

bash 复制代码
sed '1i# start' t.txt

6. 往不带字符a-n的行前插入# no char 'a'-'n' v

bash 复制代码
sed "/[a-n]/i"#" no char 'a'-'n' v" t.txt

7. 往行数不为1-10的行前插入# rows num >= 10

bash 复制代码
sed '1,10!i # rows num >= 10' t.txt

8. 往行数为奇数的行前插入# odd num v

bash 复制代码
sed '1~2i# odd num v' t.txt

删除行的sed文本编辑命令------d

1. 删除第十二行

bash 复制代码
sed '12d' t.txt

2. 删除行数为偶数的行

bash 复制代码
sed '2~2d' t.txt

3. 删除在每一个if和fi之间的行1

bash 复制代码
sed '2,11d' t.txt

4. 删除在每一个if和fi之间的行2

bash 复制代码
sed -r "/if|fi|then|\t/d" t.txt
# -r选项表示使用扩展正则库

5. 清空所有行

bash 复制代码
sed 'd' t.txt

6. 删除第十二行到最后一行

bash 复制代码
sed '12,$d' t.txt

修改行的sed文本编辑命令------c, s

1. 将所有行修改为aaaaa

bash 复制代码
sed 'caaaaa' t.txt

2. 将所有的echo命令改为echo echo

bash 复制代码
sed '/echo/cecho echo' t.txt

3. 将所有带字符s或b的行改为***

bash 复制代码
sed -e '/[sb]/c***' t.txt

4. 将所有带字符s或b的行改为***,并在第一行前面插入a,在最后一行后面添加b

bash 复制代码
sed -e '/[sb]/c***' -e '$ab' t.txt | sed '1ia'

5. 将字符a转为b,将字符c转为d

bash 复制代码
sed 's/a/b/;s/c/d/' t.txt

6. 在没有then的每一行的末尾添加分号1

bash 复制代码
sed -r '/then/!s/$/;/' t.txt

7. 在没有then的每一行的末尾添加分号2

bash 复制代码
sed -r '/then/!s/$/&;/' t.txt

8. 在每一行的开头添加#

bash 复制代码
sed 's/^/#/' t.txt

9. 在每一行的开头添加\t

bash 复制代码
sed 's/^/\t/' t.txt

10. 在每一行的开头删除\t

bash 复制代码
sed 's/^\t//' t.txt

其它命令

1. 输出2-7行

bash 复制代码
sed -n '2,7p' t.txt

2. 输出1-10行

bash 复制代码
sed -n '1,10p' t.txt

3. 输出行号

bash 复制代码
sed '=' t.txt

区块命令

1. 将所有行都变为空行

bash 复制代码
sed 'g' t.txt

2. 双写t.txt文件

bash 复制代码
sed 'H;$G' t.txt

3. 将带有$的行都变为空行

bash 复制代码
sed '/\$/g' t.txt

4. 在每一行的后面都插入空行

bash 复制代码
sed 'G' t.txt

5. 在每一行的前面都插入空行

bash 复制代码
sed 'i-' t.txt | sed '/^-$/g'

6. 交换奇偶行,奇数行后面没有行不交换

bash 复制代码
sed -n '1~2h;2~2{G;p};$p' t.txt

sed命令的选项

选项 用途 记巧
-n 不输出默认输出 -n = not print
-r 使用扩展正则表达式 -r = regex
-e 从左到右依次执行在每个-e后面的命令(执行多个命令)
-i 直接修改文件

其中,由于这几个sed命令的选项对我们来说已经能解决90%的问题了,并且记起来也了如指掌,几乎不需要深度学习,所以我们的sed命令就先讲到这里了。

下篇预告

awk命令------功能强大的文本处理工具

相关推荐
Victor3561 小时前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端
缘不易1 小时前
Springboot 整合JustAuth实现gitee授权登录
spring boot·后端·gitee
Kiri霧1 小时前
Range循环和切片
前端·后端·学习·golang
WizLC2 小时前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
Victor3562 小时前
Netty(19)Netty的性能优化手段有哪些?
后端
爬山算法2 小时前
Netty(15)Netty的线程模型是什么?它有哪些线程池类型?
java·后端
白宇横流学长2 小时前
基于SpringBoot实现的冬奥会科普平台设计与实现【源码+文档】
java·spring boot·后端
Python编程学习圈3 小时前
Asciinema - 终端日志记录神器,开发者的福音
后端
bing.shao3 小时前
Golang 高并发秒杀系统踩坑
开发语言·后端·golang
壹方秘境3 小时前
一款方便Java开发者在IDEA中抓包分析调试接口的插件
后端