0

sed命令描述如下

删除 10,000 美元或更多的汽车。将 的输出通过管道传输sort到 ased中来执行此操作,只要我们匹配表示记录末尾的 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 个或更多数字的正则表达式并退出的命令是什么?

4

3 回答 3

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)。

于 2012-11-26T21:27:24.410 回答
1

其他方式。

由于您没有发布文件示例,因此这是猜测。在这里,我正在寻找字段 5 小于 10000 的带有单词“chevy”的行。

awk '/chevy/ {if ( $5 < 10000 ) print $0} ' 汽车

我忘记了来自 grep 的标志 -i ...所以正确的是:

awk 'BEGIN{IGNORECASE=1} /chevy/ {if ( $5 < 10000 ) print $0} ' 汽车

$猫>汽车

雪佛兰 2 3 4 10000

雪佛兰 2 3 4 5000

雪佛兰 2 3 4 1000

雪佛兰 2 3 4 10000

雪佛兰 2 3 4 2000

上一页 2 3 4 1000

上一页 2 3 4 10000

$ awk 'BEGIN{IGNORECASE=1} /chevy/ {if ( $5 < 10000 ) print $0} ' 汽车

雪佛兰 2 3 4 5000

雪佛兰 2 3 4 1000

雪佛兰 2 3 4 2000

于 2015-04-11T19:42:41.890 回答
0
grep -iv chevy cars | sort -nk 5 | sed '/[0-9][0-9][0-9][0-9][0-9]$/d'
于 2017-05-27T23:28:21.330 回答