开发者

Why does this `grep -o` fail, and how should I work around it?

开发者 https://www.devze.com 2022-12-12 00:46 出处:网络
Given the input echo abc123def | grep -o \'[0-9]*\' On one computer (with GNU grep2.5.4), this returns 123, and on another (with GNU grep 2.5.1) it returns the empty string. Is there some explanati

Given the input

echo abc123def | grep -o '[0-9]*'

On one computer (with GNU grep 2.5.4), this returns 123, and on another (with GNU grep 2.5.1) it returns the empty string. Is there some explanation for why grep 2.5.1 fails here, or is it just a bug? I'm using grep -o in this way in a bash script that I开发者_开发问答'd like to be able to run on different computers (which may have different versions of grep). Is there a "right way" to get consistent behavior?


Yes, 2.5.1's -o handling was buggy: http://www.mail-archive.com/bug-grep@gnu.org/msg00993.html

Grep is probably not the right tool for this; sed or tr or even perl might be better depending on what the actual task is.


you can use the shell. its faster

$ str=abc123def
$ echo ${str//[a-z]/}
123


I had the same issue and found that egrep was installed on that machine. A quick solution was using

 echo abc123def | egrep -o '[0-9]*'


This will give similar results:

echo abc123def | sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p'

Your question is a near-duplicate of this one.


Because you are using a regex so you must use either:

  1. grep -E
  2. egrep (like Sebastian posted).

Good luck!

0

精彩评论

暂无评论...
验证码 换一张
取 消