我怎样才能使这个sed捕获实现更复杂的替换

时间:2012-02-23 22:41:44

标签: regex linux perl sed awk

在我的代码库中修复大量拼写错误时,我使用了这个:

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 个答案:

答案 0 :(得分:3)

尝试:

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.

答案 1 :(得分:2)

这个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);

答案 2 :(得分:2)

试试这个

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表示变量名称