【问题标题】:Sed | awk to remove line after matching next line赛德 | awk 匹配下一行后删除行
【发布时间】:2017-06-14 06:10:24
【问题描述】:

如果Name 连续出现,则删除名字

Name john
Age 30

Name Alice

Name Travis
Age 12

Name Monty

Name Hannah

想要的输出

Name john
Age 30

Name Travis
Age 12

Name Hannah

我尝试过的命令:

sed '/^Name/ {N; /\n$/d}' file.txt

sed '/Name/{$!N;/\n\nName/!P;D}' file.txt

【问题讨论】:

  • sed '/^Name/ {N; /\n$/d}'sed (GNU sed) 4.2.2 上按我的预期工作......你的版本是什么?
  • GNU sed 版本 4.2.1
  • sed '/^Name/ {N; /\n$/d}' 的输出粘贴到问题中......也许你有dos风格的行尾?

标签: regex linux bash awk sed


【解决方案1】:

这是一个使用awk的方法,

awk_script:

BEGIN{a=0}                                                                                                                                                                                                   
/Name/{ if(a==1){print $0;name=""}else{name=$0"\n"} a=1 }
/Age/{printf "%s%s\n\n",name,$0; a=0;}

然后执行:

$ awk -f awk_sc file.txt
Name john
Age 30

Name Travis
Age 12

Name Hannah

简要说明:

变量a 是用于记录Name 之前是否出现过的标志。在打印行后设置a=0

【讨论】:

    【解决方案2】:

    你可以使用这个 awk 命令:

    awk 'NF && /^Name/ {n=NR; p=$0; next}
         NF && n {if ($0 !~ /^Name/) print p; n=0} END{if (n) print p} 1' file
    
    Name john
    Age 30
    
    
    Name Travis
    Age 12
    
    
    Name Hannah
    

    【讨论】:

    • 看来你会在两个打印行之间留出空白行。 :)
    • 可以的。目前它只是剥离多条Name
    【解决方案3】:

    可能不是您正在寻找的东西,但为什么不尝试只保留您感兴趣的东西。

     sed -n '/^Name/ {N; /Age.*/p}' file.txt
    

    会给你以下结果

    Name john
    Age 30
    Name Travis
    Age 12
    

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多