sed (stream editor) is a non-interactive command-line text editor.
官方的定义是非交互的命令行文本编辑器。而我觉得描述成“行内文本插入、删除、替换的小工具“更容易理解。
说到”行内“,即以一行文本为单位进行处理。sed的工作模式如下图,读入一行文本到内部的buffer,执行处理文本命令,输出到屏幕。然后读入下一行文本,进行下一轮处理。
sed使用方法
sed使用格式:
sed -option 'cmd' file
其中,-option是sed的一些选项,'cmd'是处理文本的命令,如插入、删掉、替换等,file是待处理的文件。
cmd一般用单引号括起来,格式如下:
'[line num]X[options]'
- line num是指定待处理的单行或几行。如果不指定行号,即为所有行。
- X是执行的命令,如a(append)、d(delete)、i(insert)、s(search and replace)等。
- options是指某些命令后可以带额外的参数。
sed基本用法示例
示例一:
第一行插入日期
sed '1i //2019-2-13' rtl.v
示例二:
删除\`timescale 1ns/100ps行
sed '/\x60timescale/d'
注:
- \`用ASCII码0x60转义。
- /xxx/是用正则的方式来指定要处理哪些行,也可以理解成包含xxx的行。
示例三:
endmodule后面加// xxx
sed '/endmodule/a // xxx' rtl.v
示例四:
把output wire修改成output reg
sed '/output/s/wire/reg/' rtl.v
示例五:
看看analog verilog model文件中有哪些module
sed -n '/^module/p' ana_v.v
注:
- -n是取消默认的打印,即仅打印匹配的行。
- p是打印命令。
示例六:
把逗号分隔的端口或者变量分成多行书写
sed 's/,/,\n/g' rtl.v
注:
- \n是回车符,用来换行
- g是指行内替换多次,如果不加g则替换一次。
示例七:
统计rtl的行数
sed -n '$=' rtl.v
示例八:
把//aa的下一行中的assign加上延时
sed '///aa/{n;s/assign/assign #1/}' rtl.v
注:
n是跳转到下一行,再执行后面的命令。
sed高级用法示例
sed内部有两个存储空间,模式空间(pattern space)和保持空间(hold space)。模式空间就是上面提到的“行buffer”,而保持空间可以理解为另一个buffer,可以暂存任何临时数据。你可以想象成CPU的两个寄存器,通过类似汇编的指令来操作。
- g 将hold space中的内容拷贝到pattern space中
- G 将hold space中的内容追加到pattern space中
- h 将pattern space中的内容拷贝到hold space中
- H 将pattern space中的内容追加到hold space中
- d 删除multiline pattern中的所有行,并读入下一行到pattern中
- D 删除multiline pattern中的第一行
- x 交换保持空间和模式空间的内容
示例九:
删除rtl中的多行注释/ ... /
cat -n script
1 //\ * /!{p;d}
2 :a
3 /\ * //!{N;ba}
4 s//\ .\ \* ///
5 p
sed -nf script rtl.v
注:
- 第1行,当没有遇到/ 的行时,先输出,然后d忽略掉下方的其它sed命令,退出本次处理。只有遇到/ 才开始执行后续的命令。
- 第2行,:a设置标签
- 第3行,如果没有遇到 * /,就把内容追加到pattern space
- 第4行,遇到 /后,执行查找替换,把/ ... * /删除
- 第5行,输出删除注释后的rtl
- 由于sed正则没有非贪婪模式,不然就可以直接全部读到pattern space再用正则。
- -f选项是指sed命令写在脚本里,好处是不需要考虑shell的转义,写多个命令时比较方便。
示例十:
交换rtl中的相邻两行
sed -n '{h;n;G;p}' rtl.v
注:
- h把第一行存入hold space
- n读入第二行到pattern space(覆盖掉第一行)
- G把hold space中的内容追加到pattern space
- p输出
sed手册下载
《GNU sed, a stream editor 》version 4.5, 30 March 2018 by Ken Pizzini, Paolo Bonzini(85页)
下载链接:
https://pan.baidu.com/s/1S09m...
作者:陈锋
文章来源:ExASIC
推荐阅读
- PCIe物理层:链路初始化和训练:EIOS(Electrical Idle Ordered Set)
- vim进阶01: 修改匹配关键字,让编码更高效
- 几种自动生成verilog代码的方法
- PCIe学习(二)
- 高性能CPU微架构应该具有哪些特性?
更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。