在模式之前添加/插入行,使得要添加的行具有大写的模式的一部分

时间:2014-10-27 18:45:26

标签: regex perl shell awk sed

我必须在类声明之前添加编译器指令,如:

`ifndef MIPI_RFFE_SCOREBOARD__SV
`define MIPI_RFFE_SCOREBOARD__SV

class mipi_rffe_scoreboard extends uvm_scoreboard;

我试过了:

sed 's/class (\w+)(.*)/\`ifndef \U\1__SV\2/' mipi_rffe_scoreboard.sv 

给出了:

sed: -e expression #1, char 38: invalid reference \2 on `s' command's RHS

我见过Using sed, Insert a line below (or above) the pattern?。在这里,Kamal的答案仅解决了我需要捕获的部分问题" mipi_rffe_scoreboard"并将其更改为大写

1 个答案:

答案 0 :(得分:1)

您可以在文件中运行此perl单行程序:

perl -pe 's/(class (\w+))/`ifndef \U$2\E__SV\n`define \U$2\E__SV\n\n$1/'

它捕获包含" class"的行。接着是一个单词,并在前面加上两行。 \U用于将匹配转换为大写,\E用于转换转换。

测试出来:

$ perl -pe 's/(class (\w+))/`ifndef \U$2\E__SV\n`define \U$2\E__SV\n\n$1/'  <<<"class mipi_rffe_scoreboard extends uvm_scoreboard;"
`ifndef MIPI_RFFE_SCOREBOARD__SV
`define MIPI_RFFE_SCOREBOARD__SV

class mipi_rffe_scoreboard extends uvm_scoreboard;

或者(在GNU sed上测试,我相当确信这不会在其他版本上运行):

sed -r 's/class (\w+)/`ifndef \U\1\E__SV\n`define \U\1\E__SV\n\n&/'

-r启用扩展正则表达式模式,允许您使用( )捕获模式。通常,您必须使用\( \)转义它们。