sed
говорит о базовых регулярных выражениях POSIX, которые не включают +
в качестве метасимвола. Портативно, перепишите, чтобы использовать *
:
sed 's/\.\.*/_/'
или если все, что вас когда-либо будет волновать, это Linux, вы можете использовать различные GNU-измы:
sed -r 's/\.\.*/_/' # turn on POSIX EREs (use -E instead of -r on OS X)
sed 's/\.\+/_/' # GNU regexes invert behavior when backslash added/removed
Этот последний пример отвечает на ваш другой вопрос: символ, который является буквальным при использовании как есть, может иметь особое значение при обратной косой черте, и даже если в данный момент %
не имеет специального то есть, когда речь идет об обратном слое, будущее не означает, что \%
безопасно.
Дополнительное примечание: вам не нужны две отдельные команды sed
в конвейере.
echo $name | sed -e 's/\%20/_/' -e 's/\.+/_/'
(Кроме того, вам нужно делать это только один раз для каждой строки или для всех случаев? Возможно, вы захотите модификатор /g
.)