2013-04-22 5 views
1

Я пытаюсь заменить определенные периоды в текстовом файле с помощью sed. Мой файл что-то вроде этого:Заменить период, окруженный символами с помощью sed

a.b 
aa.bb 
aa. b 
a . b 

То, что я пытаюсь сделать, это заменить периоды, которые имеют символы перед и сразу после них с «§». В этом случае «a.b» и «aa.bb». мне удалось сделать это с Grep, а затем СЭД:

egrep '[[:alpha:]]\.[[:alpha:]]' | sed 's/\./§/g' 

Но это не позволит мне продолжать управлять файлом. И если я пытаюсь

sed 's/[[:alpha:]]\.[[:alpha:]]/§/g' 

было бы заменить строку типа «a.b» в «п» вместо «a§b».

Справка очень ценю!

ответ

3

Вам нужно «поймать» детали, а затем распечатать их снова.

sed 's/\([[:alpha:]]\)\.\([[:alpha:]]\)/\1§\2/g' 

\([[:alpha:]]\)\.\([[:alpha:]]\) Формат указывает XXX.YYY. Затем вы печатаете их с \1§\2, будучи \1 первой частью, \2 второй ... обернутой между \(... \).

Если вы хотите получить дополнительную информацию, эта ссылка может помочь вам: RegExp - keeping parts of a pattern in sed

+1

+1 прямо в точку! – Kent

+1

@Roadhouse, если этот ответ или kch решили вашу проблему, подумайте о принятии одного из них, поэтому ясно, что ваша проблема завершена, и это полезно для следующих людей, входящих в эту страницу. – fedorqui

0

По какой-то причине sed меня не любит, но вот то же самое с perl:

perl -pe 's/(\w)\.(\w)/$1§$2/g' 

Функция регулярное выражение, вы ищете, называется «захватывает».

Update: по какой-то причине -E требовалось для sed:

sed -E 's/([[:alpha:]])\.([[:alpha:]])/\1§\2/g' 
Смежные вопросы