Регулярные выражения не могут совпадать с перекрывающимися интервалами.Таким образом, если у вас есть ,,,,
, первые две запятые будут первым совпадением, а третья и четвертая запятые будут составлять второе совпадение.Нет никакого способа сопоставить вторую и третью запятую с /??/
.
Как правило, это можно сделать, используя предпросмотр, чтобы одна из запятых не была частью совпадения;но sed
не поддерживает это.Таким образом, вы можете переключиться на более мощный движок регулярных выражений, такой как perl
:
echo "123456,,7,,,,890" | perl -pe 's/,(?=,)/,?/g'
В качестве альтернативы, поскольку в вашем конкретном случае вы пропустите любую другую соседнюю пару запятых, вы можете просто запустить sed
дважды:
echo "123456,,7,,,,890" | sed 's/,,/,?,/g' | sed 's/,,/,?,/g'
или объединить две операции в один sed
вызов:
echo "123456,,7,,,,890" | sed 's/,,/\,?,/g; s/,,/,?,/g'