为什么要用sed?
在做芯片项目时,我们经常需要对大文件进行处理,例如提取部分关键信息,在使用gvim或者vscode等交互式编辑器打开大文件往往需要等待几分钟或者几十分钟,而使用sed命令不需要打开文件,并且执行速度非常快,往往在几十秒内就能完成大量数据的处理,因此sed是大文件处理的高效编辑器。
1.sed简介
我们常用的vim和vscode均是的交互式文本编辑器,而sed 被称作流编辑器(stream editor)。流编辑器 则是根据事先设计好的一组规则编辑数据流
sed 按如下顺序执行操作
(1) 从输入中读取一行数据。
(2) 根据命令匹配数据。
(3) 按照命令修改数据流中的数据。
(4) 输出新的数据(根据命令写入文件或者输出到 STDOUT)。
sed对一行数据执行完所有命令之后,会读取下一行数据并重复这个过程。sed在
处理完数据流中的所有行后,就结束运行。
2.sed基础使用案例
2.1.sed 使用说明如下:
2.2.在命令行中运行sed命令
如下案例中,使用替换命令(s)将dog替换成了cat。
2.3.对文件进行编辑
本案例中,使用替换命令(s)将bb替换成11
sed 编辑器并不会修改文本文件的数据。它只是将修改后的数据发送到
STDOUT。查看原来的文本文件,并没有发生变化
2.4.对原文件进行修改
采用 -i 选项直接对原文件进行修改
2.5.使用执行多个命令
sed命令行可以执行多条命令,采用分号(;)隔离
2.6.使用-f指定命令文件
如果有较多需要执行的 sed 命令,那么将其放进单独的文件通常会更方便一些。可以在 sed
命令中用-f 选项来指定文件
在文件replace.sed中,每行都是一条单独的命令,不需要分号(;)
2.7.替换操作
替换命令格式如下:
s/pattern/replacement/flags
pattern表示匹配的内容
replacement表示替换的内容
flags表示替换选项
数字:只替换数字指定处的内容
g: 表示替换所有的匹配内容,不使用g选项时只替换每行的首个匹配内容
p:额外打印出替换后的行
w file:将替换后的结果写入文件
2.7.1.数字指定替换位置
指定替换第二处匹配的内容
2.7.2.g选项
使用g指定每行替换全部匹配内容
2.7.3.p选项
p和-n配合只打印出被替换的1行内容
2.7.4.写入文件
如下图所示,将替换后1行数据写入文件test1.v。
只有哪些包含匹配模式的行才会被保存在指定的输出文件中,如图所示,test1.v只有一行被替换后的数据。
2.7.5.使用感叹号作为分隔符
替换文件中的路径会比较烦琐。如果想将/etc/passwd 文件中的 bash shell 替换为 C shell,则
必须这么做:
$ sed 's//bin/bash//bin/csh/' /etc/passwd
由于正斜线被用作替换命令的分隔符,因此它在匹配模式和替换文本中出现时,必须使用反
斜线来转义。这很容易造成混乱和错误。
为了解决这个问题,sed 编辑器允许选择其他字符作为替换命令的替代分隔符:
$ sed 's!/bin/bash!/bin/csh!' /etc/passwd
在这个例子中,感叹号(!)被用作替换命令的分隔符,这样就更容易阅读和理解其中的路
径了
2.8.指定命令作为范围
在默认情况下,在 sed 编辑器中使用的命令会应用于所有的文本行。如果只想将命令应用于 特定的某一行或某些行,则必须使用行寻址。
在 sed 编辑器中有两种形式的行寻址
以数字形式表示的行区间。
匹配行内文本的模式。
以上两种形式使用相同的格式来指定地址:
[address]command
也可以将针对特定地址的多个命令分组:
address {
command1
command2
command3
}
sed 编辑器会将指定的各个命令应用于匹配指定地址的文本行。本节将演示如何在 sed 编辑
器脚本中使用这两种寻址方法
2.9.删除行
使用d命令来删除行
2.9.1.删除指定的行
sed '3 d ' data6.v 删除文件data6.v的第三行
sed '1,2 d ' data6.v 删除文件data6.v的第一行和第二行
sed '3,$ d ' data6.v 删除第三行到文件结尾
2.9.2.删除匹配中的行
sed '/44/d ' data6.v 删除文件data6.v中匹配到44的行
sed '/44/d ;/33/d' data6.v 删除文件data6.v中匹配到44的或者匹配到33的行
还可以通过匹配模式指定区间,以分号隔离,指定的第一个模式
会“启用”行删除功能,第二个模式会“关闭”行删除功能,而 sed 编辑器会删除两个指定行之 间的所有行(包括指定的行):
sed '/22/,/44/ d' data6.v 删除文件data6.v中匹配到22和44区间范围内的所有行
如果没有匹配到区间结束行,则会从“启动行”开始删除到文件末尾
sed '/33/,/77/ d' data6.v 命令没有匹配到包含77的行,所以从33开始删除到文件末尾
2.10.插入文本
插入(insert)(i)命令会在指定行前增加一行。
附加(append)(a)命令会在指定行后增加一行。
其命令格式如下:
sed '[address]command\ new line'
sed '3 i\new line' data6.v 命令在文件data6.v的第3行前插入行new line
sed '$ i\new line' data6.v 命令在文件data6.v的尾行前插入行new line
sed '/22/ i\new line' data6.v 命令在文件data6.v匹配22的行前插入行new line
要插入或附加多行文本,必须在要插入或附加的每行新文本末尾使用换行符(\n):
2.11.打印选项
打印(p)命令用于打印文本行。
等号(=)命令用于打印行号。
列出(l)命令用于列出行。
p和-n的配合:在命令行中用-n 选项可以抑制其他行的输出,只打印包含匹配文本模式的行
等号命令会打印文本行在数据流中的行号,行号由数据流中的换行符决定。数据流中每出现
一个换行符,sed 编辑器就会认为有一行文本结束了
sed -n '/c/ {=;p}' data66.v 表示打印匹配字符c的行及其行号
列出命令(l)可以打印数据流中的文本和不可打印字符(例如制表符\t、行尾$)。
2.12.写入文件
写入(w)命令用来向文件写入行。该命令格式如下所示:
[address]w filename
filename 可以使用相对路径或绝对路径,但不管使用哪种,运行 sed 编辑器的用户都必须
有文件的写权限。地址可以是 sed 支持的任意类型的寻址方式,比如单个行号、文本模式、行区
间或文本模式区间。
sed -n '1,2 w test.v' data7.v 指示将文件data7.v的第一行和第二行写入文件test.v。
sed -n '/cc/ w test.v' data7.v 指示将文件data7.v中匹配cc的行写入文件test.v
sed '/22/ r ./data8.v' data7.v 指示读取文件data8.v所有行插入在文件data7.v匹配22的行后
读取命令配合删除命令配合使用可以实现利用另一个文件中的数据来替换当前文件中内容
作者:IC小鸽
文章来源:IC芯视界
推荐阅读
更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。