根据逻辑添加行

时间:2019-09-19 06:36:46

标签: perl awk sed

根据某种逻辑,寻找不存在三行的方法。

我已经找到了查找某些单行和多行模式所需的正则表达式,但不知道如何将它们结合在一起。

逻辑如下:

添加这三行...


** #MEA_DATA_END **;
MEA OK;TRUE

...如果...

\;(FALSE|TRUE)\;-?\d{0,3}\;-?\d{0,3}.?\d{0,3}\;\n

...后面没有...

$\n^\*\* #MEA_DATA_END \*\*\;

...或文件的最后一行是:

\;(FALSE|TRUE)\;-?\d{0,3}\;-?\d{0,3}.?\d{0,3}\;\z

不会更改的输入文件:

FALSE;FALSE;-1;25.0;FALSE;FALSE;-1;25.0;

** #MEA_DATA_END **;
MEA OK;TRUE

将要更改的输入文件:

FALSE;FALSE;-1;25.0;FALSE;FALSE;-1;25.0;

Some other text

输出:

FALSE;FALSE;-1;25.0;FALSE;FALSE;-1;25.0;

** #MEA_DATA_END **;
MEA OK;TRUE

Some other text

另一个将被更改的输入文件:

FALSE;FALSE;-1;25.0;FALSE;FALSE;-1;25.0;

输出:

FALSE;FALSE;-1;25.0;FALSE;FALSE;-1;25.0;

** #MEA_DATA_END **;
MEA OK;TRUE

我想使用sed或awk或类似文件创建脚本。有人知道解决方案吗?

1 个答案:

答案 0 :(得分:0)

这不是很正确,我现在没有时间调试它,但是方法是用不需要替换的多行字符串来分隔记录,然后在每个记录中替换您要执行的字符串要替换:

BEGIN { RS=";(FALSE|TRUE);-?[0-9]{0,3};-?[0-9]{0,3}.?[0-9]{0,3};\n\n[*][*] #MEA_DATA_END [*][*];"; ORS="" }
{ print gensub(/;(FALSE|TRUE);-?[0-9]{0,3};-?[0-9]{0,3}.?[0-9]{0,3};/,"&\n\n** #MEA_DATA_END **;","g") RT }

以上将GNU awk用于多字符RS和RT。您将其保存在名为foo.awk的文件中,然后以awk -f foo.awk inputfile的身份执行。您可以将前导正则表达式部分保存在变量中,以免将其硬编码两次。