Поменяйте струну в Скобках с non_greedy шаблоном

Я пытаюсь поменять струну в (), и после нежадного шаблона.

Вход:

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 и замененный с нежадным шаблоном.

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

0
задан 24 October 2016 в 22:40

1 ответ

Если строки, с которыми вы работаете, так же просты, как пример ввода и вывода, я бы сказал, что вы делаете это сложнее, чем есть. Вы можете просто искать «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» , которое не является открывающей или закрывающей скобкой , пока не достигнет буквальной закрывающей скобки.

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

Жадность не вступает в игру в этой ситуации, но если это происходит для проекта, над которым вы работаете, просто добавьте знак вопроса (например, * становится *?), Чтобы сделать его не жадным.

1
ответ дан 28 September 2019 в 08:26

Другие вопросы по тегам:

Похожие вопросы: