The question mark matches the existence of the preceding character or character class zero or one time only:
$ echo "tt" | awk '/to?t/{print $0}'$ echo "tot" | awk '/to?t/{print $0}'$ echo "toot" | awk '/to?t/{print $0}'$ echo "tt" | sed -r -n '/to?t/p'$ echo "tot" | sed -r -n '/to?t/p'$ echo "toot" | sed -r -n '/to?t/p'
In the first two examples, the character o exists zero and one time, whereas in the third example, it exists two times, which doesn't match the pattern
In the same way, you can use the question mark with the character class:
$ echo "tt" | awk '/t[oa]?t/{print $0}'$ echo "tot" | awk '/t[oa]?t/{print $0}'