Я хочу разбить строку на ,
в качестве разделителя. Моя проблема в том, что в некоторых случаях вход может содержать запятые. Изменение разделителя не является вариантом. Я хочу, чтобы пользователи могли избежать запятая с \
, и поэтому я хочу разделить только на ,
но не на \,
так:Разделить строку только с неэкранированным разделителем
str="1,10,100,1\,000,10\,000,100\,000"
while [[ ${#str} -gt 0 ]]; do
#Get index of delimiter
index=$(echo "$str" | grep -boP '(?<!\\),' | head -c 1)
#If index is empty, there is nothing to do
if [[ -z "$index" ]]; then
echo "$str"
break
fi
#Get the next string we're looking for
echo "$str" | cut -c1-$index
#Cut the original string
str=$(echo "$str" | cut -c$(($index+2))-${#str})
done
Это в настоящее время печати:
1
10
100
1\,000
10\,000
100\,000
Но Я хочу, чтобы напечатать:
1
10
100
1,000
10,000
100,000
теперь я могу использовать sed
заменить \,
с ,
, но все это решение кажется довольно громоздким для относительно простой проблемы. Есть лучший способ сделать это?
Если у вас есть возможность манипулировать вашими данными, прежде чем пытаться разбить его, почему бы просто не использовать символ, который, как вы знаете, не будет там. # например. Затем вы можете просто разделить запятой и заменить все # с, потом? –
@Remuze да, это тоже вариант, но при этом я буду добавлять ограниченный символ, который должен быть ','. Поэтому, если кто-то хочет использовать '#' один день, я буду сидеть с аналогичной проблемой. – Ian2thedv
При необходимости вам нужно будет избежать обратных косых черт (если один из ваших объектов заканчивается на '\', вы хотите записать его как '\\'). Это может стать совершенно неуправляемым в чистой оболочке ... –