2014-02-05 4 views
2

Я пытаюсь заменить (с sed) группу, соответствующую регулярному выражению, но лучшее, что я могу извлечь из своих тестов, - это строка, которая заменяет всю строку в правой части sed разделитель.Замена групп регулярных выражений с помощью sed

Пример:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g" 

Выход:

this is a sample 421 string 

Желаемый выход:

this is a sample id='1' string 

Возможно ли это? Как?

EDIT:

То, что я пытаюсь сделать, это на самом деле заменить только группу, совпавшие с регулярным выражением, а не всю строку на левой стороне SED сценария. Сказал (а) другими словами: Я хочу заменить только «42» на «1», не используя «id =».

+0

Неясно, что вы имеете в виду. Можете ли вы улучшить объяснение с помощью большего количества примеров? – fedorqui

+0

@fedorqui Сделано, см. Править – alexandernst

+0

Ммм, тогда из моего удаленного ответа это должно сделать это -> 'echo", это пример id = '42 'string "| sed -r "s/'[^'] * '/' 5 '/" '. То есть просто проверить что-либо между одинарными кавычками. – fedorqui

ответ

5

Может быть, так?

$ echo "this is a sample id='42' string" | sed -r "s/id='.*?'/id='1'/g" 

Результат:

это образец ID = '1' строка

Или вы можете сделать это:

$ echo "this is a sample id='42' string" | sed -r "s/(id=')(.*?)(')/\11\3/g" 
this is a sample id='1' string 

Результат:

это образец ID = '1' строка

+0

Нет, см. Комментарии по моему вопросу. Это абсолютно не то, о чем я прошу. – alexandernst

+0

AFAIK sed не имеет возможности смотреть (вперед) позади, поэтому весь шаблон будет заменен чем-то в любом случае. Но если ваш шаблон прост в вашем примере, то копирование его на заменяемую часть не кажется проблематичным. –

+0

Я добавил другой вариант, не повторяя шаблон как константу только как групповую копию. –

0

В sed, то весь левый регулярное выражение relpaced правым регулярным выражением вся. Если вы хотели бы сохранить часть левого регулярного выражения, вы должны явно скопировать его вправо или сделать его захват группы, а также:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g" 

правильно заменить все матч, id='42' с 421 так \1 есть 42. Если вы хотите сохранить ту часть, которая говорит id=..., вы должны положить его в замене:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/id='1'/g" 
0

Вот простой способ сделать это в awk

echo "this is a sample id='42' string" | awk -F\' '{$2=1}1' OFS=\' 
this is a sample id='1' string 

Он использовать ' в поле сепаратор, а затем просто заменить значение в поле # 2

Это должно работать также:

awk -F\' '$2=1' OFS=\' 
Смежные вопросы