Home > OS >  Linux Bash grep extract word from matching string
Linux Bash grep extract word from matching string

Time:10-22

I have numbers starging with a special character @ and ending with 900 and I now I want to extract the text in between excluding them. My code:

>> cat demo.txt
asdfsdf
@ 1234900 asdf dfasd
asdf @ 1345900-asdfad wer
@ 678900-asdfa adf 

>> grep -Po '@\K.*900' demo.txt
1234900
1345900
678900

Expected answer:

1234
1345
678

CodePudding user response:

You can use

grep -oP '@\s*\K\d ?(?=900)'

See the regex demo. Details:

  • -o - the option makes grep output all matched substrings rather than lines where a match occurred
  • P - enables the PCRE regex engine rather than the default POSIX BRE
  • @ - a @ char
  • \s* - zero or more whitespaces
  • \K - match reset operator discarding all text matched so far
  • \d ? - one or more digits, as few as possible
  • (?=900) - until the first, leftmost, occurrence of 900 char sequence.

See the online demo:

#!/bin/bash
s='asdfsdf
@ 1234900 asdf dfasd
asdf @ 1345900-asdfad wer
@ 678900-asdfa adf '
grep -oP '@\s*\K\d ?(?=900)' <<< "$s"

Output:

1234
1345
678
  • Related