Bird
Raised Fist0
Bash Scriptingscripting~20 mins

Capture groups in Bash in Bash Scripting - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Bash Capture Groups Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
💻 Command Output
intermediate
2:00remaining
What is the output of this Bash script using capture groups?
Consider the following Bash script that uses a regex with capture groups. What will it print?
Bash Scripting
text="User: alice, ID: 42"
if [[ $text =~ User: ([a-z]+), ID: ([0-9]+) ]]; then
  echo "Name=${BASH_REMATCH[1]}, Number=${BASH_REMATCH[2]}"
else
  echo "No match"
fi
AName=User, Number=alice
BName=alice, Number=42
CNo match
DName=, Number=
Attempts:
2 left
💡 Hint
Remember that BASH_REMATCH stores the full match at index 0, and capture groups start at index 1.
📝 Syntax
intermediate
1:30remaining
Which Bash regex syntax correctly captures two groups?
Which option correctly uses capture groups in a Bash regex inside [[ ]]?
A[[ $var =~ /(foo)(bar)/ ]]
B[[ $var =~ \(foo\)\(bar\) ]]
C[[ $var =~ (foo)(bar) ]]; then
D[[ $var =~ (foo)(bar) ]]
Attempts:
2 left
💡 Hint
Bash regex inside [[ ]] does not use slashes or escaped parentheses.
🔧 Debug
advanced
2:30remaining
Why does this Bash script fail to capture groups?
Given this script, why does it print 'No match' even though the text looks correct? text="abc123" if [[ $text =~ abc([0-9]+) ]]; then echo "Number: ${BASH_REMATCH[1]}" else echo "No match" fi
AThe variable text is not quoted in the regex
BThe regex is missing anchors ^ and $
CThe script is run with sh, not bash
DBASH_REMATCH is not set outside functions
Attempts:
2 left
💡 Hint
Check which shell runs the script; sh does not support BASH_REMATCH.
🚀 Application
advanced
3:00remaining
Extract domain and path from URL using Bash capture groups
You want to extract the domain and path from this URL using Bash regex capture groups: url="https://example.com/path/to/page" Which option correctly extracts domain and path into variables domain and path?
Aif [[ $url =~ https://([^/]+)/(.*) ]]; then domain=${BASH_REMATCH[1]}; path=${BASH_REMATCH[2]}; fi
Bif [[ $url =~ https://(.*)/(.*) ]]; then domain=${BASH_REMATCH[1]}; path=${BASH_REMATCH[2]}; fi
Cif [[ $url =~ https://([^/]+)(/.*) ]]; then domain=${BASH_REMATCH[1]}; path=${BASH_REMATCH[2]}; fi
Dif [[ $url =~ https://([^/]+)(.*) ]]; then domain=${BASH_REMATCH[1]}; path=${BASH_REMATCH[2]}; fi
Attempts:
2 left
💡 Hint
The domain ends before the first slash after https://, and path starts after the slash.
🧠 Conceptual
expert
3:00remaining
How many capture groups are in this Bash regex?
In the Bash regex used inside [[ ]]: regex='(a(b)c)(d(e)f)' How many capture groups does this regex have, and what does BASH_REMATCH[3] contain if matched against 'abcdef'?
A4 groups; BASH_REMATCH[3] = 'def'
B3 groups; BASH_REMATCH[3] = 'e'
C5 groups; BASH_REMATCH[3] = 'd'
D5 groups; BASH_REMATCH[3] = 'b'
Attempts:
2 left
💡 Hint
Count all parentheses pairs, including nested ones.

Practice

(1/5)
1. What does the BASH_REMATCH array hold after a successful regex match in Bash?
easy
A. The full matched string at index 0 and captured groups from index 1 onwards
B. Only the captured groups without the full match
C. The regex pattern used for matching
D. The exit status of the last command

Solution

  1. Step 1: Understand BASH_REMATCH usage

    When using [[ string =~ regex ]], Bash stores the full matched text in BASH_REMATCH[0].
  2. Step 2: Identify captured groups storage

    Captured groups from parentheses in the regex are stored starting at BASH_REMATCH[1] onwards.
  3. Final Answer:

    The full matched string at index 0 and captured groups from index 1 onwards -> Option A
  4. Quick Check:

    BASH_REMATCH = full match + groups [OK]
Hint: Remember index 0 is full match, groups start at 1 [OK]
Common Mistakes:
  • Thinking BASH_REMATCH holds only groups
  • Confusing BASH_REMATCH with exit status
  • Expecting regex pattern in BASH_REMATCH
2. Which of the following is the correct syntax to test if a string matches a regex and capture groups in Bash?
easy
A. match $string $regex
B. if ($string =~ $regex); then
C. [[ $string =~ $regex ]]
D. test $string =~ $regex

Solution

  1. Step 1: Recall Bash regex match syntax

    Bash uses the conditional expression [[ string =~ regex ]] to test regex matches.
  2. Step 2: Identify correct syntax among options

    Only [[ $string =~ $regex ]] uses the correct Bash syntax with double brackets and the =~ operator.
  3. Final Answer:

    [[ $string =~ $regex ]] -> Option C
  4. Quick Check:

    Use [[ ]] with =~ for regex match [OK]
Hint: Use double brackets [[ ]] with =~ for regex matching [OK]
Common Mistakes:
  • Using single brackets [ ] which don't support =~
  • Using parentheses () like in other languages
  • Using commands like test or match incorrectly
3. What will be the output of this Bash script?
string="user:1234"
if [[ $string =~ ([a-z]+):([0-9]+) ]]; then
echo "Name=${BASH_REMATCH[1]}, ID=${BASH_REMATCH[2]}"
fi
medium
A. Name=user, ID=1234
B. Name=user:1234, ID=
C. Name=, ID=
D. Syntax error

Solution

  1. Step 1: Analyze regex and string

    The regex ([a-z]+):([0-9]+) matches letters before colon and digits after colon in the string "user:1234".
  2. Step 2: Check captured groups in BASH_REMATCH

    BASH_REMATCH[1] captures "user" and BASH_REMATCH[2] captures "1234".
  3. Final Answer:

    Name=user, ID=1234 -> Option A
  4. Quick Check:

    Captured groups print correct values [OK]
Hint: Captured groups appear in BASH_REMATCH starting at index 1 [OK]
Common Mistakes:
  • Expecting full string in BASH_REMATCH[1]
  • Forgetting to use double brackets [[ ]]
  • Misreading regex pattern
4. Identify the error in this Bash snippet:
string="abc123"
if [[$string =~ ([a-z]+)([0-9]+)]]; then
echo "${BASH_REMATCH[1]} and ${BASH_REMATCH[2]}"
fi
medium
A. Regex pattern is invalid
B. Missing spaces inside [[ and ]]
C. BASH_REMATCH is not set by =~ operator
D. Using single brackets instead of double brackets

Solution

  1. Step 1: Check syntax of conditional expression

    The conditional expression [[ ... ]] requires spaces after [[ and before ]]. The snippet misses spaces.
  2. Step 2: Confirm regex and BASH_REMATCH usage

    The regex is valid and BASH_REMATCH is set correctly when using =~ inside [[ ]].
  3. Final Answer:

    Missing spaces inside [[ and ]] -> Option B
  4. Quick Check:

    Spaces needed inside [[ and ]] [OK]
Hint: Always put spaces after [[ and before ]] [OK]
Common Mistakes:
  • Omitting spaces inside [[ ]]
  • Confusing single [ ] with [[ ]]
  • Assuming regex pattern is wrong
5. You want to extract the domain and path from a URL string in Bash using capture groups. Which regex and code snippet correctly captures domain and path?
url="https://example.com/path/to/page"
if [[ $url =~ https://([^/]+)(/.*) ]]; then
echo "Domain: ${BASH_REMATCH[1]}"
echo "Path: ${BASH_REMATCH[2]}"
fi
hard
A. Captures domain and path but misses https:// prefix
B. BASH_REMATCH does not support multiple groups
C. Fails because regex does not escape dots
D. Correctly captures domain as example.com and path as /path/to/page

Solution

  1. Step 1: Analyze regex pattern

    The regex https://([^/]+)(/.*) matches 'https://' literally, then captures domain (any chars except '/') and path (slash followed by anything).
  2. Step 2: Check BASH_REMATCH usage

    BASH_REMATCH[1] holds domain, BASH_REMATCH[2] holds path, correctly extracted from the URL.
  3. Final Answer:

    Correctly captures domain as example.com and path as /path/to/page -> Option D
  4. Quick Check:

    Regex groups extract domain and path correctly [OK]
Hint: Use ([^/]+) for domain and (/.*) for path [OK]
Common Mistakes:
  • Not escaping dots in regex (not needed inside character class)
  • Assuming BASH_REMATCH can't hold multiple groups
  • Missing literal https:// in regex
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard