我有一个文件在 Linux 和 Unix 环境中具有这种模式。
# file1
text1 98432230
text2 123412
text3 10
line4 0
line5 0
line6 40000
... ...
line10 20
... ...
我试图排除以 结尾的行0
,但不排除以10
、20
、40000
等结尾的行98432230
。
我已经测试过 、|grep -v "\0$"
、| grep -v "[[:space:]]0$"
、| grep -v " 0"
、| sed '/0/d'
,| sed "/0$/d"
但它们都不起作用,因为它们排除了任何以 0 结尾的行,包括 10、20、40000 和 98432230。
有什么建议么?
答案1
不要使用grep
,而是使用awk
:
$ awk '$NF!=0' file
text1 98432230
text2 123412
text3 10
line6 40000
... ...
line10 20
... ...
在 中awk
,变量NF
s 是字段数,$NF
最后一个字段也是如此。计算结果为 true 的表达式意味着“打印此行”,因此$NF!=0
意味着“打印最后一个字段不为 0 的每一行”。
您甚至可以将其进一步简化为:
awk '$NF' file
答案2
对于 grep,您需要一个匹配三项内容的正则表达式:非数字字符,后跟“0”,位于行尾:
grep -v '[^0-9]0$'
您是否还想匹配并丢弃所有仅以两个零结尾的行00
?
答案3
你需要匹配一个 0,这样你就可以说它是一个完整的“单词”
grep -vw '0$'
只会匹配(并因为 而排除-v
)以“单词”0 结尾的行。
答案4
使用乐(以前称为 Perl_6)
raku -ne '.put if .grep( none / \D 0 $/ );'
上面使用了Raku的grep
例程。正则表达式原子\D
是非数字。该例程利用了 Raku 的none
连接点,该连接点测试是否存在正则表达式匹配。如果您只是put
不带条件地返回if
,则会返回原始文件,其中包含未找到匹配项的空白行。
输入示例:
text1 98432230
text2 123412
text3 10
line4 0
line5 0
line6 40000
line10 20
示例输出:
text1 98432230
text2 123412
text3 10
line6 40000
line10 20
TMTOWTDI:在这种情况下,换出grep
并使用 match
会产生相同的回报。也match(/…/)
可以更简单地写为m/…/
,并且none
grep/match 运算符内部可以与前面的内容交换!
,如下所示。 (特别感谢 Bruce Gray 的见解/讨论):
raku -ne '.put if .match( none / \D 0 $/ );'
#OR
raku -ne '.put if ! .match( / \D 0 $/ );'
#OR
raku -ne '.put if ! m/ \D 0 $/;'
https://docs.raku.org/routine/none
https://docs.raku.org/routine/grep
https://raku.org