регулярное выражение заменить - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь заменить все вхождения слова, но только тогда, когда они помещены в пару разделителей.Пример:

Original: asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf
Desired:  asdf oldfoo asdf ("asdf newfoo asdf newfoo asdf") asdf oldfoo asdf

Есть ли способ сделать это с sed или awk ?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Если разделителями являются '("' и '")', и в каждой строке встречается только одно вхождение разделителей:

sed -e ':begin;s/\(.*(".*\)oldfoo\(.*").*\)/\1newfoo\2/;t begin'

Не работает, если у вас есть несколько вхождений в строке как 'oldfoo'в середине ниже находятся внутренние разделители:

asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf ("asdf oldfoo asdf oldfoo asdf") asdf oldfoo asdf

Если ваши разделители '(' и ')', это работает, даже если у вас есть несколько разделителей на строку:

sed -e ':begin;s/\(.*([^)]*\)oldfoo\([^(]*).*\)/\1newfoo\2/;t begin'
0 голосов
/ 01 августа 2011

да, как @nobody упомянул, это что-то вроде

oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$)

Полагаю, вам, вероятно, придется немного поиграть с экранированием ", чтобы он правильно работал с awk / sed

если у вас есть Perl, это будет

perl -pe 's/oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$)/newfoo/g' whatever.txt

EDIT: Хорошо, извините, я не знал, что sed / awk вообще не поддерживает lookahead / lookbehind. Я боюсь, что нет способа выполнить эту задачу, по крайней мере, с нетерпением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...