根据某种逻辑,寻找不存在三行的方法。
我已经找到了查找某些单行和多行模式所需的正则表达式,但不知道如何将它们结合在一起。
逻辑如下:
添加这三行...
** #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或类似文件创建脚本。有人知道解决方案吗?
答案 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
的身份执行。您可以将前导正则表达式部分保存在变量中,以免将其硬编码两次。