Ко мне пришел сотрудник с проблемой, которая, как мне показалось, будет тривиальной, но оказалась сложной. Сложность заключается в следующем: с учетом входной строки, какие команды Unix можно использовать для распечатки любых соответствующих шаблонов в строке?
Допустим, у нас есть следующая строка ввода.
12345 4444 abc 789012 xyz 1234567 def 987654321 qrz 60606
Цель состоит в том, чтобы распечатать любые 5-значные или 6-значные числа в строке, но не любые 4-значные или 7-значные числа.
Сначала мы подумали об использовании sed следующим образом:
echo "12345 4444 abc 789012 xyz 1234567 def 987654321 qrz 60606" |
sed 's/.*[^0-9]\{1\}\([0-9]\{5,6\}\).*/\1/g'
Эта команда, однако, печатает только последнее вхождение любых подходящих шаблонов.
Мы наконец-то придумали использовать комбинацию sed и grep -Eo.
echo "12345 4444 abc 789012 xyz 1234567 def 987654321 qrz 60606" |
sed 's/^/ /' | sed 's/$/ /' | grep -Eo '[[:space:]]+[0-9]{5,6}[[:space:]]+' |
sed 's/ $//' | sed 's/^ //'
Это работает, но кажется немного глупым. Есть ли лучший способ?