You must match one or more consecutive digits using grep with BASIC regular expressions (no -E). Which pattern is correct?
LPIC-1 Exam 101-500, objective 103. GNU and Unix commands hard
Draft — not checked yet. This question was written from the published exam objectives and cites the clause it comes from, but nobody has yet read it against that clause and signed for it.
It is kept out of search results and out of mock exams until they have. Read the source below before you take the answer as settled.
The options
Not correct grep '[0-9]\*' file
Wrong. \* escapes the asterisk into a literal '*', so this looks for a digit followed by a star. Even unescaped, '[0-9]*' means 'zero or more digits', which matches the empty string and so matches every line.
Not correct grep '[0-9]+' file
Wrong with BRE. Unescaped + is a literal plus sign here, so this matches a digit followed by an actual '+' character. It would be correct with grep -E.
Correct grep '[0-9]\+' file
Correct. In a basic regular expression the + quantifier must be escaped as \+ to act as 'one or more'. This is a GNU extension, but it is the standard behaviour of GNU grep.
Not correct grep '\d+' file
Wrong. \d is Perl-style shorthand supported by tools like grep -P or pcregrep, not by basic or extended POSIX regular expressions.
Why
In basic regular expressions the metacharacters + ? { } ( ) | need a backslash to take on their special meaning; . * [ ] ^ $ are special without one. Extended regular expressions (grep -E, egrep) invert this: + ? { } ( ) | are special as typed. The POSIX-portable BRE alternative here is '[0-9][0-9]*'. Anchors behave the same in both dialects: ^ matches the start of a line and $ the end, so '^$' finds empty lines.
Where this comes from
- Cited
- LPI exam objective 103.7
- What it says
- Understand the difference between basic and extended regular expressions.
Practise this
Reading one question is not practice. The trainer will draw a set from objective 103 and space the ones you get wrong.