我想删除第一行之后包含模式的每一行(模式是/^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 很开心。t
b