【问题标题】:sed - insert lines when text found / not foundsed - 在找到/未找到文本时插入行
【发布时间】:2016-09-27 20:58:33
【问题描述】:

我有 sed 的问题,我需要用 csv 文件完成两件事

  1. 在每行不开始UNES的前面我需要添加标签“BF2;”
  2. 在文件的开头(如果存在 UNES)我需要添加一个标签“UNH;”

示例(无 UNES;)

50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;

示例(使用 UNES;)

UNES;
50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;

到目前为止我有这个:

sed -e 's/^\([^"UNES"]\)/BF2;\1/' | sed '/UNES/ a\UNH;'

这与 UNES 一样有效;标签存在 - 我似乎无法弄清楚如何插入 UNH;当 UNES 不存在时!

非常感谢任何帮助

样本输出:

UNES;
UNH;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;

【问题讨论】:

  • 中间出现的NCTS-(TA) 是什么?
  • 这只是绒毛 - 我将对其进行编辑,使其看起来像原始输入 - 我很抱歉像往常一样匆忙!
  • 如果顶部没有UNES怎么办?
  • 如果原始消息中不存在,则不应将其添加到输出中。到目前为止,第一个命令在不存在时有效,我不知道如何添加 UNH;部分
  • 一位同事刚刚保释了我 - 这似乎是一种享受:
    |sed -e '1s/^(UNES.*$)/\1\nUNH;/' -e ' 1,$s/^([^"UNES"])/BF2;\1/' -e '1s/^(BF2.*$)/UNH;\n\1/'

标签: sed


【解决方案1】:

以下是使用 awk 的方法:

awk 'NR==1 {if(f=/^UNES;/)print; print "UNH;"} !f{print "BF2;" $0} {f=0}' file

在第一行,如果 /^UNES;/ 匹配,print 它并设置标志 f。始终打印“UNH;”。如果设置了f 标志,则不要执行下一个操作,该操作适用于其余行。始终在第一行之后将f 重置为 0,因此所有其他行都有“BF2;”添加到开头。

测试一下:

$ cat file
UNES;
50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;
$ awk 'NR==1 {if(f=/^UNES;/)print; print "UNH;"} !f{print "BF2;" $0} {f=0}' file
UNES;
UNH;
BF2;50000024;IE15;041111;113901;verstuurd;Aangift;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
$ cat file2
50000024;IE15;041111;113901;verstuurd;Aangift;
50000024;IE15;041111;113901;verstuurd;Aangifte;
50000024;IE15;041111;113901;verstuurd;Aangifte;
$ awk 'NR==1 {if(f=/^UNES;/)print; print "UNH;"} !f{print "BF2;" $0} {f=0}' file2
UNH;
BF2;50000024;IE15;041111;113901;verstuurd;Aangift;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;
BF2;50000024;IE15;041111;113901;verstuurd;Aangifte;

【讨论】:

  • 嗨,谢谢,这似乎只在文件中存在 UNES 时才有效。我需要能够处理不包含 UNES 的文件,然后是 UNH;在开始和BF2处添加;到每一行的开头
  • 所以总是添加“UNH;”但低于“UNES;”如果已经存在?
  • 我已经更改了代码,以便它现在可以执行您想要的操作。
  • 太棒了 - 干杯我很感激 - 快速进入我的下一个危机 :)
  • 短一点awk '{f=/^UNES;/;print f?$0"\nUNH;":"BF2;"$0}' file
【解决方案2】:

你可以使用这个 sed 命令:

sed '/^UNES;$/{i\
UNH;
n};s/^/BF2;/;' file.txt

详情:

/^UNES;$/i\ UNH;在UNES时插入新行;是整行。

n 用下一行替换模式空间

【讨论】:

    【解决方案3】:

    试试这个,它对我有用

    sed '/^UNES;$/{i\
    UNH;
    n};s/^[0-9]*/BF2;&/;' 
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多