Используя lookaheads и lookbehinds, вы можете указать «ровно одну цифру» или «ровно три цифры» или что угодно. Это делает ровно одну цифру:
echo 'WB123_4' | grep -Po '(?<![[:digit:]])([[:digit:]]{1})(?![[:digit:]])'
Result: 4
Что он делает, так это находит цифру, которой не предшествует цифра, а также за которой не следует цифра. Также работает для более чем одной цифры. Это делает три цифры, затем, по крайней мере, одно из чего-либо еще, затем одну цифру:
echo 'WB123_4' | grep -Po '(?<![[:digit:]])([[:digit:]]{3})(?![[:digit:]]).+(?<![[:digit:]])([[:digit:]]{1})(?![[:digit:]])'
Result: 123_4
Пока я в этом, эта комбинация grep и sed найдет строку из трех цифр, затем одну или несколько из чего-то еще, затем одну цифру, и аккуратно извлечет только эти части. (Возможно, был другой способ сделать это просто в grep с группами.)
echo 'WB123_4' | grep -Po '(?<![[:digit:]])([[:digit:]]{3})(?![[:digit:]]).+(?<![[:digit:]])([[:digit:]]{1})(?![[:digit:]])' | sed -r -e 's/[^[:digit:]]+/ /'
Result: 123 4
Примечание: флаг -P для grep означает использование регулярных выражений в стиле Perl, что позволяет вам использовать lookaheads и lookbehinds.