【问题标题】:Add lines based on logic根据逻辑添加行
【发布时间】:2020-01-20 03:15:02
【问题描述】:

如果基于某些逻辑,如果它们不存在,则寻找一种将三行添加到文件中的方法。

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

逻辑是这样的:

添加这三行...


** #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 或类似工具创建一个脚本。有谁知道这个问题的解决方案吗?

【问题讨论】:

  • 安装perl没问题。
  • 如果是这样,最简单的方法是将整个文件读入内存。使用-n-p 时,-0777 将导致整个文件被视为行。
  • @EdMorton:从awk Ed :) 中拿走什么!只是想说在perl 中没有像-0 选项这样的直接方法。
  • @Inian awk 相当于-v RS='\0' 对我来说似乎很简单,并且与您指定任何其他字符作为记录分隔符的方式一致,它不是 NUL 独有的。
  • @EdMorton:我删除了我的评论 Ed!再次没有反对awk

标签: perl awk sed


【解决方案1】:

这不太对,我现在没有时间调试它,但方法是用你不想替换的多行字符串分隔你的记录,然后在每条记录中替换你做的字符串想要更换:

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 执行它。您可以将前导的正则表达式部分保存在一个变量中,从而不必对它进行两次硬编码。

【讨论】:

    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2018-07-28
    • 2019-11-18
    相关资源
    最近更新 更多