У меня есть функция, translate(), принимает несколько параметров. Первые пары являются единственным обязательными и является строкой, что я всегда завернуть в одинарных кавычках, например:regex для первого экземпляра определенного символа, который НЕ приходит сразу после другого определенного символа
translate('hello world');
Другого PARAMS не являются обязательным, но могут быть включены как это:
translate('hello world', true, 1, 'foobar', 'etc');
И сама строка может содержать спасся одинарные кавычки, например:
translate('hello\'s world');
Теперь я хочу искать все файлы кода для всех экземпляров этого вызова функции и извлекать только строку. Для этого я придумал следующий grep, который возвращает все между translate (' и либо '), либо ',. Почти идеально:
grep -RoPh "(?<=translate\(').*?(?='\)|'\,)" .
Проблема с этим, хотя, является то, что если вызов что-то вроде этого:
translate('hello \'world\', you\'re great!');
Мой Grep будет возвращать только это:
hello \'world\
Так что я хочу изменить это, чтобы часть, которая в настоящее время выглядит s для «) или », вместо ищет первое вхождение ", что не сбежали, т.е. не сразу следуют \
Надеюсь, я смысл. Любые предложения, пожалуйста?
Предполагая, что строка не заканчивается сбежавшего обратной косой черты, вы можете использовать отрицательное в 'назад положительный предпросмотр -?.?) * (=' '(<= \ (перевод \) | (? https://regex101.com/r/wD6oL6/1 –
@JoshCrozier: Что, если строка заканчивается беглым обратным слэшем? –
Что-то по строкам '(? <= Translate \ (') (\\' | [^ ']) *' должно делать трюк. –