使用 sed 删除第一行之后与模式匹配的行

使用 sed 删除第一行之后与模式匹配的行

我想删除第一行之后包含模式的每一行(模式是/^country\t/)。我可以删除每一个出现sed '/^country\t/d' in.txt > out.txt,但我想将第一次出现保留在第一行。

背景故事是,我有一个带有标题的制表符分隔文件目录,我用 连接这些文件cat。我想删除多余的标题。

在 Vim 中我可以做类似的事情: 2,$g/^country\t/d,但我无法找出 sed 解决方案。当我尝试时,sed '2,$ /^country\t/d in.txt > out.txt我收到错误unknown command: /

谢谢!

答案1

没有直接的方法,但这是一个解决方法:

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt

答案2

这可能对你有用:

sed '1b;/^country\t/d' in.txt > out.txt

或者

sed '1!{/^country\t/d}' in.txt > out.txt

答案3

sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

这将删除第一个匹配行之后的每个匹配行。注释:

/图案/- 匹配模式

{X- 如果以上匹配,则交换模式并保持缓冲区

;/模式/!{x;h;b;}- 现在测试模式缓冲区(第一次匹配时它将为空),如果不!已经包含模式,则将“x”模式与保持缓冲区交换回来,然后将模式缓冲区复制到保持缓冲区“h”中,并将“b”分支到脚本末尾,并加载下一行。

;x;d}- 仅当上一步中的否定模式匹配失败时才会执行此位 - 即模式缓冲区与您的模式匹配。在这种情况下,将保持和模式缓冲区再次交换回“x”,并删除“d”行。

答案4

如果 /pattern/ 不匹配空行,则使用“hold将空格初始化为空行”来测试第一个匹配项:

保留第一行:

sed '/pattern/ {x; /^$/!d; g;}' file

删除第一行:

sed '/pattern/ x' file

仅编辑第一行:

sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file

仅编辑以下行:

sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file

PS:或后面跟着$'\n'(not a ;) ,这让 bsd sed 很开心。tb

相关内容