有选择地使用sed删除行

有选择地使用sed删除行,sed,Sed,我有一个文本文件(比如说文件) 我想从文件中删除“Name”,除非它出现在文件头中。我知道sed会删除行,但是如果我这样做了 sed '/Name/d' file 它删除了所有“名称” 所需输出: Name aaa bbb ccc xxxx yyyy tttt 您能建议我应该使用哪些选项吗?如果您知道第一个标题位于第一行,请按如下方式跳过它: sed '1!{/Name/d}' infile 这意味着该模式应适用于除第1行以外的所有行 或者反过来说: sed -n '2,${/Name/d

我有一个文本文件(比如说文件)

我想从文件中删除“Name”,除非它出现在文件头中。我知道sed会删除行,但是如果我这样做了

sed '/Name/d' file
它删除了所有“名称”

所需输出:

Name
aaa
bbb
ccc
xxxx
yyyy
tttt

您能建议我应该使用哪些选项吗?

如果您知道第一个标题位于第一行,请按如下方式跳过它:

sed '1!{/Name/d}' infile
这意味着该模式应适用于除第1行以外的所有行

或者反过来说:

sed -n '2,${/Name/d};p' infile
可能使用
awk

 awk '/Name/ && c++ == 0 || !/Name/' infile
所有情况下的输出:

Name
aaa
bbb
ccc
xxxx
yyyy
tttt
使用以下命令:

sed '1!{/Name/d}' file

前面的命令适用于除第一行以外的所有行。

您可能会发现awk语法更直观:

awk 'NR==1 || !/Name/' file

上面只说
如果是行号1或者行号不包含“Name”,那么首先打印它

您必须准确地解释如何区分“header”和“content”…header是字符串“Name”第一次出现的时候。它会出现多次,因为我合并了许多较小的文件,所有文件都有标题“Name”,所以在合并它们之前,请从每个文件中删除第一行。在那里做起来更容易,因为你知道第1行是一个标题。一旦它们结合在一起,你就完全无法分辨什么是标题,什么是恰巧看起来像标题的内容。不客气。保留
记住操作员。它否定sed中的条件表达式
awk 'NR==1 || !/Name/' file