我有这样的东西:
plym fury 77 73 2500
chevy nova 79 60 3000
ford mustang 65 45 10000
volvo gl 78 102 9850
ford ltd 83 15 10500
chevy nova 80 50 3500
fiat 600 65 115 450
honda accord 81 30 6000
ford thundbd 84 10 17000
toyota tercel 82 180 750
chevy impala 65 85 1550
ford bronco 83 25 9500
我需要创建一个列表,显示除雪佛兰以外的所有价格低于 10,000 美元的汽车。 列表应从最低成本到最高成本排序。
我必须使用带有退出选项和正则表达式的sed
(不要使用重复)
到目前为止,我有这个
grep -iv "chevy" cars | sort -nk 5 | sed '/regex$/ q'
我在没有重复的情况下遇到正则表达式问题。
这是家庭作业吗?
- 由于您已经按成本升序排序,因此您只需要 当成本变为五位数时停止抢线。
sed '/regex$/q'
将在以下情况下停止(因为q
(退出)命令) 无论regex$
是什么,都是匹配的。- 你已经有一个
$
来匹配结尾 行,所以你只需要regex
中代表五的东西 任意字符(或数字,如果您认为这样更好)。 -
之后,您将需要更多管道命令来仅获取汽车名称(请参阅cut
)并删除重复项(请参阅sort -u
和/或uniq
)
跟进评论:
我现在假设重复的意思是不希望您的正则表达式模式包含重复(即[a-z][a-z][a-z]
)。 (我最初认为你的意思是你不想要重复的汽车名称,所以我现在已经删除了这一部分。
您可能会对这些语法感兴趣:
以及:
?
- 零或一*
- 零或多+
- 一个或多个
还有:
{n}
- 正好n
次{n,}
-n
次或更多次。{n,m}
-n
到m
次。
您可能还希望在使用这些时指定-r
,这样您就不必转义所有内容。 (例如sed -r '[a-z]{3}'
而不是sed '[a-z]{3}'
.
有关 egrep 语法(sed
使用)的更多信息,请参阅man egrep
下的正则表达式。
你可以简单地使用GNU awk
来做到这一点:
awk '!/chevy/ && $NF < 10000 { print | "sort -nk 5" }' file.txt
结果:
fiat 600 65 115 450
toyota tercel 82 180 750
plym fury 77 73 2500
honda accord 81 30 6000
ford bronco 83 25 9500
volvo gl 78 102 9850
更新:
以下是使用GNU sed
的一种方法:
< file.txt sort -nk 5 | sed -nre '/chevy/d' -e '/.* [0-9]{,4}$/p'
结果:
fiat 600 65 115 450
toyota tercel 82 180 750
plym fury 77 73 2500
honda accord 81 30 6000
ford bronco 83 25 9500
volvo gl 78 102 9850
带有awk
和GNU sort
:
awk '!/chevy/{if($5 < 10000){print}}' file.txt | sort -n -k 5
输出
fiat 600 65 115 450
toyota tercel 82 180 750
plym fury 77 73 2500
honda accord 81 30 6000
ford bronco 83 25 9500
volvo gl 78 102 9850
sed
不是为了进行算术表达式而设计的。有些人尝试过 Sed 替换可能涉及算术吗?
另一个使用Perl
的解决方案,在Minix
&Archlinux
上测试(非常便携)
perl -lane '
END{for (sort {$a<=>$b} keys %h) {print $h{$_}}}
$h{$F[-1] . " " . $F[1]} = join "t", @F
if $F[-1] < 10000 && $F[1] ne "chevy"
' file.txt