Как я могу сделать этот захват Sed выполнить более сложную замену - PullRequest
2 голосов
/ 24 февраля 2012

при исправлении массовых орфографических ошибок в моей кодовой базе я использовал это:

find . -path '*/.svn' -prune -o -name  "*min.js" -prune -o -name "*min.css" -prune -o -name "flashLocaleXml.xml" -prune -o -type f -print0 | xargs -0 egrep -n "priority=" -exec sed -i 's/replace/newval/' {} \;

, чтобы исправить конкретную орфографическую ошибку во всех файлах в моем репо.

однако яне очень хорошо с захватом sed, я хочу сделать что-то вроде:

X.addEventListener(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);
становится:
EventUtil.addEventListener(X, LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);

Я много читал, но я был бы признателенкто-то объясняет, как sed захватывает работу с этим в качестве конкретного примера.

Я сделал несколько снимков, но ничего, что я придумаю, работает: вот мои попытки

echo "X.addEventListener(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);" | sed 's/\(.*\)EventUtil\(.*EventUtil\)/\1X\2/'

echo "X.addEventListener(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);" | sed -r 's/(....),(....),(*\.addEventListener)(LevelUpEvent.*)/\1,\2\n\1,\2,/g' 

echo "X.addEventListener(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);" | sed 's/\([\.$]*\) \([\.$]*\)/\2 \1/'

спасибозаранее!

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Попробуйте с:

sed 's/\([^.]*\)\([^(]*(\)/EventUtil\2\1, /'

Вывод:

EventUtil.addEventListener(X, LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);

Объяснение:

\([^.]*\)                  # Content until first '.'
\([^(]*(\)                 # Content until first '('
EventUtil\2\1,             # Literal 'EventUtil' plus grouped content in previous expression.
2 голосов
/ 24 февраля 2012

Попробуйте это

echo "X.addEventListener(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);" | sed -e "s/\([A-Za-z]\{1,\}\)\.addEventListener(/EventUtil.addEventListener(\1, /"

Это регулярное выражение будет распознавать имя переменной, используя

\([A-Za-z]\{1,\}\)

Затем .addEventListener (

\.addEventListener(

и заменить его на

EventUtil.addEventListener(\1

В котором \ 1 представляет имя переменной

2 голосов
/ 24 февраля 2012

Подойдет эта команда sed.

sed 's/\(X\).\(addEventListener\)(\(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels\));/EventUtil.\2(\1, \3);/'

Пример

$ echo "X.addEventListener(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);" | sed 's/\(X\).\(addEventListener\)(\(LevelUpEvent.GENERIC_LEVEL_UP, updateLevels\));/EventUtil.\2(\1, \3);/'
EventUtil.addEventListener(X, LevelUpEvent.GENERIC_LEVEL_UP, updateLevels);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...