У меня есть файл со строками в следующем шаблоне:
136x2340+1564+0
то есть
.
Я хотел бы отфильтровать (возможно, с помощью 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
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