正则表达式用可选的逗号和空格替换某个单词

时间:2016-04-04 08:03:45

标签: regex sed

我有一个python代码,例如看起来像

class Foo(Bar, Baz, Jazz):
   pass

class Foo(Baz, Bar, Jazz):
   pass

class Foo(Baz, Jazz, Bar):
   pass

我需要从继承层次结构中的父项列表中删除Bar

因此,我们的想法是删除Bar左侧的可选,或右侧的(不包括)。

我试图用sed。

做到这一点
echo 'class Foo(Baz, Bar, Jazz):' | sed -r 's/(class .*\(.*)([, ]*Bar[, ]*)/\1/'

给出正确的结果

class Foo(Baz, Jazz):

3 个答案:

答案 0 :(得分:1)

如果我理解正确,那么sed应该按照您的预期进行。

sed -r '/^\s*class.*:\s*$/s/(,\s*Bar\s*|\s*Bar\s*,\s*)//g' file

输出:

class Foo(Baz, Jazz):
   pass

class Foo(Baz, Jazz):
   pass

答案 1 :(得分:0)

While not Browser("ABC").Page("PQR").Frame("XYZ").Image("BatchSuccess").Exist
  Wait 1
  Browser("ABC").Sync
Wend
    'your code here after object A is synchronized 
     Browser("ABC").Page("PQR").Frame("XYZ").Image("BatchSuccess").Click

您可以(class .*?\(.*?)(?:[\s,]+Bar\s*|\s*Bar[\s,]+) 使用此。替换。请参阅演示。

https://regex101.com/r/zJ7vZ4/2

\1

答案 2 :(得分:0)

您可以指定多个表达式以满足不同的条件,如下所示:

$ cat a.py 
class Foo(Baz, Bar, Jazz):
   pass

class Foo(Baz, Jazz, Bar):
   pass

class Foo(Bar, Baz, Jazz):
   pass
$ sed -r -e '/^\s*class.*,\s*Bar\s*,.*$/s/,\s*Bar\s*,/,/g' -e '/^\s*class.*,\s*Bar\s*\).*$/s/,\s*Bar\s*\)/)/g' -e '/^\s*class.*\(\s*Bar\s*,\s*.*$/s/\(\s*Bar\s*,\s*/(/g' a.py 
class Foo(Baz, Jazz):
   pass

class Foo(Baz, Jazz):
   pass

class Foo(Baz, Jazz):
   pass
$

正则表达式还检查它应该在python中满足class声明的行上执行替换,因此它不会触及任何其他行(例如:离开import原样)。