Jeugasce
Jeugasce

Reputation: 197

grep string after first occurrence of numbers

How do I get a string after the first occurrence of a number?

For example, I have a file with multiple lines:

  34 abcdefg
10 abcd 123
    999 abc defg

I want to get the following output:

abcdefg
abcd 123
abc defg

Thank you.

Upvotes: 0

Views: 229

Answers (5)

Walter A
Walter A

Reputation: 19982

It is not clear what you exactly want, but you can try to express it in sed. Remove everything until the first digit, the next digits and any spaces.

sed 's/[^0-9]*[0-9]\+ *//'

Upvotes: 1

iamauser
iamauser

Reputation: 11469

grep can do the job:

$ grep -o -P '(?<=[0-9] ).*' inputFIle
abcdefg
abcd 123
abc defg

For completeness, here is a solution with perl:

$ perl -lne 'print $1 if /[0-9]+\s*(.*)/' inputFIle
abcdefg
abcd 123
abc defg

Upvotes: 0

kvantour
kvantour

Reputation: 26471

Imagine the following two input files :

  001 ham
03spam
  3 spam with 5 eggs

A quick solution with awk would be :

awk '{sub(/[^0-9]*[0-9]+/,"",$0); print $1}' <file>

This line substitutes the first string of anything that does not contain a number followed by a number by an empty set (""). This way $0 is redefined and you can reprint the first field or the remainder of the field. This line gives exactly the following output.

ham
spam
spam

If you are interested in the remainder of the line

awk '{sub(/[^0-9]*[0-9]+ */,"",$0); print $0}' <file>

This will have as an output :

ham
spam
spam with 5 eggs

Be aware that an extra " *" is needed in the regular expression to remove all trailing spaces after the number. Without it you would get

awk '{sub(/[^0-9]*[0-9]+/,"",$0); print $0}' <file>

 ham
spam
 spam with 5 eggs

Upvotes: 0

Inian
Inian

Reputation: 85530

You could use Awk for this, loop through all the columns in each line upto NF (last column in each line) and once matching the first word, print the column next to it. The break statement would exit the for loop after the first iteration.

awk '{ for(i=1;i<=NF;i++) if ($i ~ /[[:digit:]]+/) { print $(i+1); break } }' file

Upvotes: 2

Maroun
Maroun

Reputation: 95948

You can remove digits and whitespaces using sed:

sed -E 's/[0-9 ]+//' file

Upvotes: 0

Related Questions