Отфильтровать строки с числами в диапазоне и изменить формат

У меня есть файл со строками в следующем шаблоне:

136x2340+1564+0

то есть x + + .

Я хотел бы отфильтровать (возможно, с помощью grep ) все строки так, чтобы диапазон N1 был от a до b и N2 диапазон от c до d .

Константы a, b, c, d зависят от моей проблемы. Я исправлю их в скрипте.

Я пробовал egrep '^ ([0-9] [0-9] [0-9] x [0-9] [0-9] [0-9] +) », но вывод показывает

136x2340+1564+0
835x428+355+1780
817x406+186+747
114x1533+1256+456

, то есть также показывает строки с N2 с 4 цифрами (я предполагал только 3 цифры).

редактировать: также я хотел бы заменить x на , (запятая), первый знак + на (пусто пробел) и второй знак + через , (запятая), поэтому вывод должен быть

N1,N2 N3,N4
0
29.11.2016, 02:13
1 ответ

In Синтаксис расширенного регулярного выражения grep (ERE), + - это квантификатор, означающий «один или несколько из предшествующих атомов». Чтобы сопоставить + буквально в этом контексте, вам нужно избежать его:

egrep '^([0-9][0-9][0-9]x[0-9][0-9][0-9]\+)' file
835x428+355+1780
817x406+186+747

Если вы хотите сделать замен , тогда grep действительно не подходит инструмент - однако, если ваша версия sed имеет аналогичный расширенный режим регулярных выражений, вы можете использовать это:

sed -En 's/([0-9]{3})x([0-9]{3})\+([0-9]{1,})\+([0-9]{1,})/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747

Если у вас есть только базовые регулярные выражения, экранирование становится труднее читать:

sed -n 's/\([0-9]\{3\}\)x\([0-9]\{3\}\)+\([0-9]\{1,\}\)+\([0-9]\{1,\}\)/\1,\2 \3,\4/p' file
835,428 355,1780
817,406 186,747
2
28.01.2020, 02:34

Теги

Похожие вопросы