谁能告诉我为什么 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
您无法将换行符与\n
in 匹配(或您尝试过的任何其他内容)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