SED 不删除行

SED 不删除行

谁能告诉我为什么 sed 无法删除0最后一列中包含的行。我已经使用了以下内容,但似乎没有任何效果。

sed "/0/d"
sed "/ 0 /d"
sed "/\t0\n/d"
sed "/0\n/d"

输出:

 93000000       95       95       3328   0
 99000000       96       96       3206   0
 99000000       96       96       3210   0
 99000000       96       96       3215   0
 99000000       96       96       3224   0
 99000000       96       96       3230   0
 99000000       96       96       3236   0
 99000000       96       96       3268   0
 99000000       96       96       3292   0
 99000000       96       96       3459   0
 591000000      85       85       2      2 CDL (control)
 321000000      40       40       109    4.2 COZI-TV
 585000000      84       84       8      8 NJTV
 585000000      84       84       8134   10 WTBY
 543000000      77       77       710    10.1 WLNY-10
 585000000      84       84       62     12 N12WC
 657000000      101      101      1014   14 OPTCH

答案1

您无法将换行符与\nin 匹配(或您尝试过的任何其他内容)sed,因为sed每行都有效,因此您认为的换行符不在其工作范围内。您正在寻找的是$特殊运算符,匹配行尾:

sed -e '/0$/d'

答案2

如果你还想删除以结尾的行,WLNY-10那么您需要比 Even 更具体一点/0$/,例如

sed -r '/\s0$/d' file

或者,如果 GNU sed 不可用

sed '/[[:space:]]0$/d' file

甚至

awk '$NF!=0' file

答案3

要删除0最后一列中包含的行,请尝试:

$ sed '/0$/d' file
591000000      85       85       2      2 CDL (control)
321000000      40       40       109    4.2 COZI-TV
585000000      84       84       8      8 NJTV
585000000      84       84       8134   10 WTBY
585000000      84       84       62     12 N12WC
657000000      101      101      1014   14 OPTCH

您的解决方案失败的原因是:

  • sed "/0/d"/0/表示匹配行包含0在任何位置,因此它将删除所有输入行。

  • sed "/ 0 /d"/ 0 /表示匹配行0前后包含空格。它不会执行任何操作,因为您的输入不匹配。

  • sed "/\t0\n/d"并且sed "/0\n/d"也不匹配,因为您使用了错误的正则表达式。

结论,对于0最后一列的匹配,您必须使用/0$/.您应该阅读man sed或任何相关文章regular expression以了解更多详细信息。

更新

根据 @steeldriver 的回答,我更新了我的答案以保留包含以下结尾的数字的行0

$ sed '/ 0$/d' cat
591000000      85       85       2      2 CDL (control)
321000000      40       40       109    4.2 COZI-TV
585000000      84       84       8      8 NJTV
585000000      84       84       8134   10 WTBY
543000000      77       77       710    10.1 WLNY-10
585000000      84       84       62     12 N12WC
657000000      101      101      1014   14 OPTCH

答案4

另一个awk命令,

$ awk '$NF==0 {next;}1' file
591000000      85       85       2      2 CDL (control)
321000000      40       40       109    4.2 COZI-TV
585000000      84       84       8      8 NJTV
585000000      84       84       8134   10 WTBY
543000000      77       77       710    10.1 WLNY-10
585000000      84       84       62     12 N12WC
657000000      101      101      1014   14 OPTCH

相关内容