Труба через sed
, как
echo "abc,,,def" | sed 's/,/|/g'
но я бы порекомендовал использовать
tr ',' '|'
в этом случае.
Мне нужно заменить повторяющийся набор символов (2 или более) на точное количество заменяющих символов. Мне нужно сделать это либо с помощью sed, либо внутри vi.
Примеры
"abc,,,def" becomes "abc|||dev" "1245d,,,,,22" becomes "1245d|||||22"
Спасибо
Труба через sed
, как
echo "abc,,,def" | sed 's/,/|/g'
но я бы порекомендовал использовать
tr ',' '|'
в этом случае.
Извините, что не комментирую, у меня нет 50 репутации.
Это решение не удастся, если есть больше шаблонов, как abc,,,def,g
.
sed -n 's/[^,],,/&/;tsubs;p;d;:subs s/,/|/g;p' <<<'abc,,,def abc,,def abc,,,def,g abc,def'
Это практически невозможно из-за работы регулярных выражений. Как уже указывал jvb, решение является простым (хотя и не обязательно коротким), если известно максимальное количество последовательных исходных символов. Если нет, то можно сначала изменить все исходные символы, а затем снова изменить отдельные символы на втором шаге. Однако это работает, только если целевой символ не встречается во входном потоке или если вы можете использовать символ, о котором известно, что он не встречается во входном потоке, в качестве промежуточной цели.
Кроме того, вам нужно принять во внимание угловые случаи одиночного исходного символа, встречающегося в начале или конце строки. Таким образом:
tr ',' '|' < file | sed 's/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/'
или же
sed 's/,/|/g;s/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/' file
Решение с использованием языка, который имеет понятие длины строки, будет более надежным.