У меня есть функция в PHP-файле:
_t('', 'Award received')
Я сделал регулярное выражение, которое находит первую часть функции _t (»
Теперь я хочу заменить эту функцию чем-то другим (на самом деле, я хочу добавить аргумент в функцию).
Из консоли:
grep -rl "_t('', 'Award received')" application | xargs sed -i "s/_t\s*\(\s*['|\"](\s*\s*)['|\"]/test/g"
Sed не хочет делать замену, он говорит: «(или (без пары»), поэтому похоже, что он пытается найти скобку внутри регулярного выражения …
Как я могу использовать sed с регулярными выражениями, содержащими скобки?
РЕДАКТИРОВАТЬ:
У меня есть тестовая строка, которую я хочу заменить:
_t('124', 'Test')
Когда я делаю простую замену
sed -i -E 's/124JHGJH/124/g'
это работает отлично.
Но если я попытаюсь заменить целую строку круглыми скобками и прочим, она просто зависает и не отвечает …
sed -i -E 's/_t\(\'124JHGJH\'/124/g'
Обратите внимание на разницу между \(
а также (
в регулярном выражении
Чтобы добавить новый параметр в конце вызова функции:
echo "_t('', 'Award received')" | sed 's/_t([^)]\+/&, new_param/'
_t('', 'Award received', new_param)
Регулярное выражение:
-t(
= буквальные символы[^)]\+
= один или несколько)
персонажиСледующим символом будет закрывающая часть функции, поэтому я предполагаю, что вы хотите вставить новый параметр. я использую &
в замене поставить текст, соответствующий регулярному выражению на своем месте.
Это сломается, если есть аргумент буквального укуса, который содержит близкий символ парен.
использование маркеров в sed с аргументом регулярного выражения
sed -r 's/(_t[^)]+)(\))/\1,new_parameter\2/g'
`(_t[^)]+)` #matches _t and all characters before the last parenthesis. Mark this pattern
(\)) #matches the last parenthesis and mark this pattern
\1,new_parameter\2/ #substitute the first marked pattern, then place the new parameter followed by the second pattern marked, which the the last parenthesis
пример
echo "_t('', 'Award received')"|sed -r 's/(_t[^)]+)(\))/\1,new_parameter\2/g'
выход
_t('', 'Award received',new_parameter)