Используйте sed с регулярным выражением и (

У меня есть функция в PHP-файле:

_t('', 'Award received')

Я сделал регулярное выражение, которое находит первую часть функции _t (»

Смотрите Regex в действии

Теперь я хочу заменить эту функцию чем-то другим (на самом деле, я хочу добавить аргумент в функцию).

Из консоли:

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'

2

Решение

Обратите внимание на разницу между \( а также ( в регулярном выражении

Чтобы добавить новый параметр в конце вызова функции:

echo "_t('', 'Award received')" | sed 's/_t([^)]\+/&, new_param/'
_t('', 'Award received', new_param)

Регулярное выражение:

  • -t( = буквальные символы
  • [^)]\+ = один или несколько) персонажи

Следующим символом будет закрывающая часть функции, поэтому я предполагаю, что вы хотите вставить новый параметр. я использую & в замене поставить текст, соответствующий регулярному выражению на своем месте.

Это сломается, если есть аргумент буквального укуса, который содержит близкий символ парен.

2

Другие решения

использование маркеров в 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)
1

По вопросам рекламы [email protected]