使用 Sed | awk 删除匹配下一行后的行

3
如果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

1
sed '/^Name/ {N; /\n$/d}' 在我的 sed (GNU sed) 4.2.2 上正常工作... 你的版本是什么? - Sundeep
GNU sed 版本 4.2.1 - Ahsan Naseem
sed '/^Name/ {N; /\n$/d}' 的输出粘贴到问题中.. 也许您有DOS风格的行尾符? - Sundeep
3个回答

1
您可以使用此 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

看起来你在两行打印之间多了一个空行。 :) - CWLiu
1
可以做到。目前它只是剥离多个“名称”行。 - anubhava

1
这是一种使用 awk 的方法, < p > 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

0

可能不完全符合你的需求,但为什么不试着只保留自己感兴趣的内容呢。

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

会给您以下的结果

Name john
Age 30
Name Travis
Age 12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接