Я хочу заменить все вхождения
{{i:very long text with some [special](https://google.com) nested text *here*}}
к
very long text with some [special](https://google.com) nested text *here*
То есть в псевдокоде я хочу получить <text>
из {{i:<text>}}
в текстовом файле.
Мне все равно, какой инструмент вы используете: grep, awk, ... Это может быть началом.
Это должен быть простой sed
однострочный текст с двумя s/old/new/g
командами.
@Barmar, потому что я хочу сопоставить {{i:
с }}
и не хочу заменять вложенные строки: {{i:hello {{i:hola}}}}
станет hello {{i:hola}}
Это будет очень сложно, поскольку регулярные выражения не могут соответствовать таким сбалансированным разделителям.
Вам нужно написать анализатор рекурсивного спуска, а не простой инструмент командной строки.
Вероятно, можно было бы сделать это с помощью Perl RE.
Вы можете добиться желаемых результатов, используя рекурсивное регулярное выражение в Perl. Это регулярное выражение будет соответствовать вашим строкам, допуская вложенные пары {{i:
-}}
:
{{i:((?>(?:(?!{{i:|}}).)+|(?R))*)}}
Это соответствует:
{{i:
: буквальный {{i:
((?>(?:(?!{{i:|}}).)+|(?R))*)
: ноль или более (отнесенных в группу 1) любого
(?:(?!{{i:|}}).)+
: один или несколько символов, которые не находятся в начале последовательности {{i:
или }}
(это умеренный жадный токен); или(?R)
: рекурсия всего шаблона}}
: буквальный }}
Демонстрация регулярных выражений на regex101
Предполагая, что test.txt
содержит:
{{i:very long text with {some} [special](https://google.com) nested text *here*}}
{{i:hello {{i:hola}}}}
Тогда ты можешь:
perl -pe 's/{{i:((?>(?:(?!{{i:|}}).)+|(?R))*)}}/\1/' test.txt
Выход:
very long text with {some} [special](https://google.com) nested text *here*
hello {{i:hola}}
Если вы хотите удалить все вхождения {{i
и }}
, вы можете просто
perl -pe 's/{{i:|}}//g' test.txt
Большой! Вы удовлетворили мои потребности. Небольшой комментарий: как применить еще и вложенный {{i: ...}}
? Итак, {{i:hello {{i:hola}}}}
становится hello hola
?
@somenxavier Я рад, что это сработало для тебя. Что касается вашего другого вопроса, не можете ли вы просто заменить {{i:
и }}
пустой строкой?
Как это сделать? Что такое регулярное выражение?
@somenxavier Ты мог бы просто perl -pe 's/{{i:|}}//' test.txt
Не работает: производит hello {{i:hola}}}}
, а не hello hola
.
@somenxavier извините, здесь нет доступа к Linux для тестирования, я забыл флаг g
: perl -pe 's/{{i:|}}//g' test.txt
Какая у вас проблема? Просто замените все
{{i:
и}}
пустыми строками.