Регулярное выражение: выберите каждое вхождение символа вплоть до другого символа

#regex #sed

Вопрос:

У меня есть пара строк в документе, который выглядит примерно так:

 foo-bar-foo[Foo - Bar]
 

Я хотел бы выбрать каждый - символ вплоть до первой [ скобки в каждой строке. Таким образом - , в квадратных скобках не следует выбирать.

Как я могу добиться этого с помощью регулярного выражения?

У меня уже есть это регулярное /. ?(?=[)/g выражение , которое выбирает каждый символ до первого [ , но я хочу только - .

Изменить: Я хочу заменить эти выбранные символы sed командой (GNU).

Ответ №1:

Вы можете использовать

 sed -E ':a; s/^([^[-] )-/1/; ta'
 

Смотрите онлайн-демонстрацию:

 #!/bin/bash
s='foo-bar-foo[Foo - Bar]'
sed -E ':a; s/^([^[-] )-/1/; ta' <<< "$s"
# => foobarfoo[Foo - Bar]
 

Подробные сведения:

  • -E — включение синтаксиса POSIX ERE (чтобы не было необходимости избегать захвата круглых скобок и квантора)
  • :a a этикетка
  • s/^([^[-] )-/1/ — находит один или несколько символов, отличных от [ и - от начала строки, записывающей эту подстроку в группу 1 ( 1 ), а затем сопоставляет - символ
  • ta — переходит к a метке при успешной замене