Я постараюсь быть максимально ясным, надеясь, что этот вопрос будет полезен для других людей, имеющих ту же проблему.
Регулярные выражения: текст соответствия внутри разделителей
В моем файле.txt я хотел бы совместить с командами «grep» и «sed» только текст внутри »(« и »)». Пример:
This is my line and (this is the text to match!), and bla bla bla...
Но некоторые линии могут выглядеть следующим образом:
Another line (text to match 1;) something else, (text to match 2)
Здесь проблемы:
Выражение типа
grep '(.*)' file.txt
или sed 's/(.*)//' <file.txt
не будет работать, потому что .*
по умолчанию жадного. Это означает, что он будет соответствовать второй пример, как это:
Другая линия (текст, чтобы соответствовать 1;) что-то другое, (текст, чтобы соответствовать 2)
решения должны быть нежадным согласование, то Я попытался использовать нежирный квантор ?
.
grep -E '\(.*?\)' file.txt
или с СЭД
sed -r 's/\(.*\)//' <file.txt
В этом случае мы должны использовать -E
и -r
сделать Grep и SED прочитать расширенные выражения, и мы также должны использовать \
перед тем (
.
Но даже это решение, похоже, не работает, я не знаю почему.
Тогда я попытался что-то вроде:
grep '(.*)[^(]*' file.txt
для того, чтобы найти строки, содержащие только один «(текст, чтобы соответствовать)» и, если я хотел бы, например, чтобы переписать текст внутри(), синтаксис будет:
sed 's/(.*)\([^(]*\)/(new text)\1/'<file.txt
Но пока это похоже на работу, я обнаружил, что '(.*)[^(]*'
матча некоторые линии, как старый (.*)
(это мистерия ...)
Все лучшее решение ?
Заранее спасибо
Для того, чтобы помочь вам, '' (. *) [^ (] * '' Совпадает с '(. *)', Потому что первый жадно сопоставляет все, что может, прежде чем перейти к следующему, и поскольку следующий также имеет квантор asterisk, он соответствует 0 раз, потому что '. *' соответствует всем. Кроме того, отличная работа, объясняющая, что вы пробовали. Добро пожаловать в StackOverflow! –
Спасибо за ответ. Я понимаю, что вы имеете в виду , Я думал, что '[^ (] *' точно остановится, когда он встретит '(', но на самом деле он никогда не встретится с ним, потому что '. *' соответствует уже всем этим. – TTK
Да, точно! Хорошая работа :) –