此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个或更多数字的正则表达式并根据此问题退出的命令?
答案 0 :(得分:4)
名义上,您应该在第二个$
之前添加/
以匹配记录末尾的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
一样)。
答案 1 :(得分:1)
另一种方式。
由于你没有发布文件样本,所以做了一个猜测。 在这里,我正在寻找带有#34; chevy"字段5小于10000的地方。
awk' / chevy / {if($ 5< 10000)print $ 0}'汽车
我忘记了grep的标志-i ......所以正确的是:
awk' BEGIN {IGNORECASE = 1} / chevy / {if($ 5< 10000)print $ 0}'汽车
$ cat>汽车
雪佛兰2 3 4 10000
雪佛兰2 3 4 5000
chEvy 2 3 4 1000
CHEVY 2 3 4 10000
CHEVY 2 3 4 2000
Prevy 2 3 4 1000
Prevy 2 3 4 10000
$ awk' BEGIN {IGNORECASE = 1} / chevy / {if($ 5< 10000)print $ 0}'汽车
雪佛兰2 3 4 5000
chEvy 2 3 4 1000
CHEVY 2 3 4 2000
答案 2 :(得分:0)
grep -iv chevy cars | sort -nk 5 | sed '/[0-9][0-9][0-9][0-9][0-9]$/d'