Ответ 1
Используйте параметр -r
, чтобы сделать sed
для использования расширенного регулярного выражения:
$ variable="something/./././"
$ echo $variable | sed -r "s/\/(\.\/)+/\//g"
something/
Я пытаюсь заменить /./
или /././
или /./././
на /
только в bash script. Мне удалось создать регулярное выражение для sed, но оно не работает.
variable="something/./././"
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g")
echo $variable # this should output "something/"
Когда я пытался заменить только подстроку /./
, она работала с regex в sed \/\.\/
. Требуется ли в sed regex больше флагов использовать умножение подстроки с +
или *
?
Используйте параметр -r
, чтобы сделать sed
для использования расширенного регулярного выражения:
$ variable="something/./././"
$ echo $variable | sed -r "s/\/(\.\/)+/\//g"
something/
Любое sed:
sed 's|/\(\./\)\{1,\}|/|g'
Но a +
или \{1,\}
даже не понадобится в этом случае, a *
будет делать красиво, поэтому
sed 's|/\(\./\)*|/|g'
должно быть достаточно
Две вещи, чтобы сделать ее простой:
$ variable="something/./././"
$ sed -r 's#(\./){1,}##' <<< "$variable"
something/
{1,}
для обозначения одного или нескольких шаблонов. Вам не понадобится g
с этим.#
в приведенном выше случае, чтобы сделать его доступным для чтения.+
- это ERE, поэтому вам нужно включить параметр -E
или -r
, чтобы использовать егоВы также можете сделать это с помощью bash встроенной замены параметров. Это не требует sed
, который не принимает -r
на Mac под OS X:
variable="something/./././"
a=${variable/\/*/}/ # Remove slash and everything after it, then re-apply slash afterwards
echo $a
something/
См. здесь для объяснения и других примеров.