Подтвердить что ты не робот

Знак sed plus не работает

Я пытаюсь заменить /./ или /././ или /./././ на / только в bash script. Мне удалось создать регулярное выражение для sed, но оно не работает.

variable="something/./././"
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g")
echo $variable # this should output "something/"

Когда я пытался заменить только подстроку /./, она работала с regex в sed \/\.\/. Требуется ли в sed regex больше флагов использовать умножение подстроки с + или *?

4b9b3361

Ответ 1

Используйте параметр -r, чтобы сделать sed для использования расширенного регулярного выражения:

$ variable="something/./././"
$ echo $variable | sed -r "s/\/(\.\/)+/\//g"
something/

Ответ 2

Любое sed:

sed 's|/\(\./\)\{1,\}|/|g'

Но a + или \{1,\} даже не понадобится в этом случае, a * будет делать красиво, поэтому

sed 's|/\(\./\)*|/|g'

должно быть достаточно

Ответ 3

Две вещи, чтобы сделать ее простой:

$ variable="something/./././"
$ sed -r 's#(\./){1,}##' <<< "$variable"
something/
  • Используйте {1,} для обозначения одного или нескольких шаблонов. Вам не понадобится g с этим.
  • Используйте разные разделители # в приведенном выше случае, чтобы сделать его доступным для чтения.
  • + - это ERE, поэтому вам нужно включить параметр -E или -r, чтобы использовать его

Ответ 4

Вы также можете сделать это с помощью bash встроенной замены параметров. Это не требует sed, который не принимает -r на Mac под OS X:

variable="something/./././"
a=${variable/\/*/}/                   # Remove slash and everything after it, then re-apply slash afterwards
echo $a
something/

См. здесь для объяснения и других примеров.