Home > Blockchain >  how to exclude certain pattern when searching in bash
how to exclude certain pattern when searching in bash

Time:03-11

Let's say I have

 abc-def1-xxx
 abc-def2-yy-vv
 abc-def3
 abc-def4

I want to output abc-def3 and abc-def4

If I use the pattern abc-def* then it outputs everything. If I search for abc-def*-* then it out puts the first two entries How do I get the last two entries?

CodePudding user response:

Let's say the data in put in a file, data.txt

abc-def1-xxx
abc-def2-yy-vv
abc-def3
abc-def4

The command to get the last two lines is:

grep -E '*[0-9]$' data.txt

Explanation:

  • -E, the pattern is interpreted as an extended regular expression.
  • *: any character
  • [0-9]: one digit
  • $: ends with the character just before the $. So here, it indicates that the string must end with a digit.

So it looks at the lines in data.txt, and outputs the lines where the last character is a digit, from 0 to 9.

CodePudding user response:

You can make the pattern more specific matching lowercase chars with a hyphen and matching 1 or more digits at the end

  • ^ Start of string
  • [a-z]\ Match 1 chars a-z
  • - Match literally
  • [a-z]\ Match 1 chars a-z
  • [0-9]\ Match 1 digits
  • $ End of string

For example

echo "abc-def1-xxx
abc-def2-yy-vv
abc-def3
abc-def4" | grep '^[a-z]\ -[a-z]\ [0-9]\ $'

Output

abc-def3
abc-def4

You could also match for example abc-def and then 1 or more digits:

^abc-def[0-9]\ $
  • Related