这个sed
命令描述如下
删除 10,000 美元或以上的汽车。通过管道将
sort
的输出通过管道到sed
中来执行此操作,方法是在记录末尾匹配表示 5(或更多)数字的正则表达式后立即退出(不要为此使用重复):
到目前为止,命令是:
$ grep -iv chevy cars | sort -nk 5
我必须在该命令的末尾添加另一个管道,我认为它"一旦我们在记录末尾匹配代表 5 位或更多数字的正则表达式,就会退出"
我尝试过这样的事情
$ grep -iv chevy cars | sort -nk 5 | sed "/[0-9][0-9][0-9][0-9][0-9]/ q"
和//
内的其他变体,但没有任何效果!匹配表示 5 个或更多数字的正则表达式并根据此问题退出的命令是什么?
名义上,您应该在第二个/
之前添加一个$
,以匹配记录末尾的 5 位数字。 如果您省略$
,那么任何 5 位数字的序列都会导致sed
退出,因此,如果在价格之前有另一个数字(也许是 VIN),它可能会在您不打算匹配时匹配。
grep -iv chevy cars | sort -nk 5 | sed '/[0-9][0-9][0-9][0-9][0-9]$/q'
总的来说,在正则表达式周围使用单引号更安全,除非你需要在其中替换一个 shell 变量(或者除非正则表达式本身包含单引号)。 您还可以指定重复:
grep -iv chevy cars | sort -nk 5 | sed '/[0-9]{5,}$/q'
{5,}
部分匹配 5 位或更多数字。 如果由于任何原因不起作用,您可能会发现您正在使用 GNU sed
并且您需要做一些类似 sed --posix
的事情才能让它在正常模式下工作。 或者,您可以只删除反斜杠。 GNU当然有选择sed
改变它使用的正则表达式机制(就像GNU grep
一样)。
另一种方式。
由于您不发布文件示例,因此将其作为猜测。在这里,我正在寻找带有单词"chevy"的行,其中字段 5 小于 10000。
awk '/chevy/{if ( $5 <10000 ) 打印 $0} ' 汽车
我忘记了来自 grep 的标志 -i ...所以正确的是:
awk 'BEGIN{IGNORECASE=1}/chevy/{if ( $5 <10000 ) print $0} ' cars
$ 猫>汽车
雪佛兰 2 3 4 10000
雪佛兰 2 3 4 5000
chEvy 2 3 4 1000
雪佛兰 2 3 4 10000
雪佛兰 2 3 4 2000
Prevy 2 3 4 1000
Prevy 2 3 4 10000
$ awk 'BEGIN{IGNORECASE=1}/chevy/{if ( $5 <10000 ) print $0} ' cars
雪佛兰 2 3 4 5000
chEvy 2 3 4 1000
雪佛兰 2 3 4 2000
grep -iv chevy cars | sort -nk 5 | sed '/[0-9][0-9][0-9][0-9][0-9]$/d'