2014-10-01 2 views
0

Может кто-нибудь объяснить мне, почему моя команда sed не работает? Я уверен, что делаю что-то глупое. Вот небольшой текстовый файл, который показывает мой вопрос:sed: группа захвата не распространяется

#!/usr/bin/env python 

class A: 
    def candy(self): 
     print "cane" 

Положи в файл и назовите его test.py

Моя цель состоит в том, чтобы добавить @profile до четкости линии с тем же отступом, что и объявление функции. Я стараюсь с этим:

$ sed -i '/\( *\)def /i \ 
\[email protected]' test.py 

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

Вот мой результат:

#!/usr/bin/env python 

class A: 
[email protected] 
    def candy(self): 
     print "cane" 

Почему что 1 помещаются там буквально вместо того, чтобы заменить мой захвата группы (четыре пространства)?

Спасибо!

ответ

1

Что об этом:

sed -i -e 's/^\(.*\)\(def.*\)/\[email protected]\n\2/' test.py 
+0

Ближе, но \ 1 должно быть перед \ 2 – firebush

+0

Разве это не ваш желаемый результат? ! #/USR/бен/окр питон Класс A: @profile четкости конфеты (само): печать "трость" – sotcha

+0

Таким образом, это работает: СЕПГ -i -e «s /^\(.* \) \ (def. * \)/\ 1 @ profile \ n \ 1 \ 2/'test.py – firebush

2

Я не знаю, что это правда, но я собираюсь предположить, что sed не поддерживает захваты с помощью селекторов адресов и в вставленный вручную текст и на самом деле может не оценивать ссылки внутри «буквального» текста вообще ,

Попробуйте sed -e 's/\(*\)def /\[email protected]\n&/' test.py вместо этого.

+0

Это работает. Спасибо! – firebush

+0

Собственно, это отбрасывает def из сигнатуры функции. – firebush

+0

О, правда. Исправлена. –

0

Просто используйте AWK:

$ awk '{orig=$0} sub(/def.*/,"@profile"); {print orig}' file 
#!/usr/bin/env python 

class A: 
    @profile 
    def candy(self): 
     print "cane" 

простой, портативный, легко расширяемый, и т.д. Отладка и т.д ....

Смежные вопросы