使用 sed 提取数字而不使用重复修饰符 (+, ?, {m} )

  • 本文关键字:数字 提取 sed 使用 regex bash sed
  • 更新时间 :
  • 英文 :


我有这样的东西:

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}-nm次。

您可能还希望在使用这些时指定-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

带有awkGNU 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

相关内容

  • 没有找到相关文章

最新更新