#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
метке при успешной замене