无法获得这个简单的sed命令

时间:2012-11-26 21:00:50

标签: linux bash shell unix

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个或更多数字的正则表达式并根据此问题退出的命令?

3 个答案:

答案 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'