2017-02-22 31 views
1

Я использую эту команду, но это не работает объявление предназначено:Sed, кажется, заменить только последнее вхождение в глобальной подстановки строк

echo "0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183+400)" | sed 's/\*\(.*\)+/*\1suma/g' 

Это ожидаемый результат:

0+223+141+800+450+1*(106suma400)+1*(1822suma500)+1*(183suma400) 

, но это что я получаю:

0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183suma400) 

Похоже, что заменяется только последнее происшествие, несмотря на использование g.

+0

Название говорит «awk», но вопрос и тег о sed. Кроме того, «не работает» не помогает - что именно происходит? Какой у вас результат? –

+0

0 + 223 + 141 + 800 + 450 + 1 * (106 + 400) + 1 * (1822 + 500) + 1 * (183suma400) – victorhernandezzero

+0

только изменить последнюю часть – victorhernandezzero

ответ

0

Попробуйте следующее:

echo "0+223+141+800+450+1*(106+400)+1*(1822+500)+1*(183+400)" | 
    sed 's/\(\*([^+]*\)+/\1suma/g' 

, который дает:

0+223+141+800+450+1*(106suma400)+1*(1822suma500)+1*(183suma400) 

Хитрость заключается в том, чтобы избежать sed «S неизменно жадные совпадения, так выражение [^+]* используется вместо .*, таким образом, подходит только к следующим образом+.


Обратите внимание, что ваша попытка не только заменить последнее появления предполагаемого рисунка, но - из-за жадное соответствие - нашло только матч охватывающей множественного предназначенных шаблоны, которые он заменил:

\*\(.*\)+ соответствует *(106+400)+1*(1822+500)+1*(183+ - все от первого * буквального к последним+ буквальным, и захват группы \1 theref руда расширена до (106+400)+1*(1822+500)+1*(183

+0

да работает, благодарю так много всего – victorhernandezzero