首页 > 解决方案 > 匹配由两个不同模式界定的文本块中的模式

问题描述

有没有办法匹配文本块中的模式,其边界是不同行上的两个独特模式?我的意思是:

/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2

期望的输出:

/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   new_line_of_some_code;   //after performing sed command
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2

我试过的:

sed '/patternWord1/,/patternWord2/{/patternWord3/i new_line_of_some_code;}' inputFile > outputFile

上面的命令似乎不起作用。

最终,我想要实现的是使用bash脚本,从.csv文件中读取一些东西,如果读入的单词是someWord然后搜索以patternWord1and为界的文本块,在该文本块内patternWord2匹配patternWord3并在其上方插入一些代码.

我有许多.cpp具有许多不同功能的文件,因此有许多不同patternWord1patternWord2.

我正在尝试做的事情是否可能sed,并且是sed此类事情的最佳工具?

也许是另一种方法:我是否可以在将脚本读取到文件if-then中时使用语句,然后使用命令匹配并插入新的代码行?bash.cppsedpatternWord3

如果您能帮助我sed,那就太好了,但如果它更有意义/更有效,我也愿意接受其他建议。先感谢您。

标签: bashsed

解决方案


这里的重点是告诉插入命令在哪里停止。

您可以通过多种方式进行操作,或者将插入的字符串放在新行上,或者通过使用'插入行结束的位置关闭 sed 命令。

您可以使用

sed -e '/patternWord1/,/patternWord2/{/patternWord3/i\
   new_line_of_some_code;
}'

或者,

sed -e '/patternWord1/,/patternWord2/{/patternWord3/i \ \ \ new_line_of_some_code;' -e '}' inputFile > outputFile

查看在线演示

s='/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2'

sed -e '/patternWord1/,/patternWord2/{/patternWord3/i \ \ \ new_line_of_some_code;' -e '}' <<< "$s"

输出:

/*some comment*/
void something_patternWord1()
{
   some_code;
   some_code;
   new_line_of_some_code;
   some_code_patternWord3;
   some_code;
}
/*some comment patternWord2

推荐阅读