Я пытаюсь поменять струну в ()
, и после нежадного шаблона.
Вход:
this is 1(the house owner 2(pet-name john james) john and his friend 3(unknown name james) james fred)
Вывод:
this is 1(the house owner 2(pet-name xxx-john xxx-james) john and his friend 3(unknown name xxx-james) james fred).
Имена только в самом маленьком ()
соответствует john
или james
и замененный с нежадным шаблоном.
Я попробовал жемчугом, но не удался получить желаемый вывод.
Если строки, с которыми вы работаете, так же просты, как пример ввода и вывода, я бы сказал, что вы делаете это сложнее, чем есть. Вы можете просто искать «john)» и «james)», например так:
$ echo "this is 1(the house owner 2(pet-name john) john and his friend 3(unknown name james) james fred)" | sed -r 's/(john\)|james\))/xxx-\1/g'
this is 1(the house owner 2(pet-name xxx-john) john and his friend 3(unknown name xxx-james) james fred)
Поскольку вы упомянули не жадные шаблоны, у меня есть ощущение, что это нечто большее, чем ваш пример. Итак, давайте представим, что мы не знаем, будет ли закрывающая скобка сразу после имен:
$ echo "this is 1(the house owner 2(pet-name john ok) john and his friend 3(unknown name james test) james fred)" | sed -r 's/(\([^()]*)(john|james)([^()]*\))/\1xxx-\2\3/g'
this is 1(the house owner 2(pet-name xxx-john ok) john and his friend 3(unknown name xxx-james test) james fred)
Первый набор скобок охватывает все после (и в том числе) буквальной открывающей скобки , что не является открывающей или закрывающей скобкой , пока не попадет в «james» или «john».
Второй набор скобок охватывает «Джон» или «Джеймс».
Третий набор скобок фиксирует что-либо после «james» или «john» , которое не является открывающей или закрывающей скобкой , пока не достигнет буквальной закрывающей скобки.
Это глобальная замена, поэтому она будет работать независимо от того, сколько у вас наборов скобок. Вы можете даже вкладывать их глубже, и это будет применяться только к наименьшему набору.
Жадность не вступает в игру в этой ситуации, но если это происходит для проекта, над которым вы работаете, просто добавьте знак вопроса (например, * становится *?), Чтобы сделать его не жадным.