我想更改我指定的文件内容,如下所示。我想注释掉除我提供的类名之外的所有包含“.class”的行。
@MyClass1.MyClass2(value = {
Class1.class,
Class2.class,
Class3.class,
Class4.class
})
public class Foo {}
例如,如果我提供 Class2 作为参数
sed -i -E 's/some_regex/Class2/g'
命令,结果应该是这样的,
@MyClass1.MyClass2(value = {
//Class1.class,
Class2.class,
//Class3.class,
//Class4.class
})
public class Foo {}
我应该为此使用什么正则表达式?
答案1
对于这样的文件:
$ cat file1
@MyClass1.MyClass2(value = {
Class1.class,
Class2.class,
Class3.class,
Class4.class
})
public class Foo {}
@MyClass11.MyClass2(value = {
Class1.class,
Class2.class,
Class3.class,
Class4.class
})
public class Foo2 {}
你可以得到这样的结果:
$ sed '/@MyClass1.MyClass2(*/,/})/{s|\sClass.*|//&|g; /Class2/{s|//||}}' file1
@MyClass1.MyClass2(value = {
// Class1.class,
Class2.class,
// Class3.class,
// Class4.class
})
public class Foo {}
@MyClass11.MyClass2(value = {
Class1.class,
Class2.class,
Class3.class,
Class4.class
})
public class Foo2 {}
解释:
'/@MyClass1.MyClass2(*/,/})/ {....}
--> 表格中操作的范围/from/,/to/{actions}
{s|\sClass.*|//&|g;
--> 适用//
于以空格开头的所有行\s
,然后Class
/Class2/{s|//||}
-->//
删除Class2
提示:在 sed 中,我们可以使用任何字符作为s/replacethis/withthat/
Syntax 的分隔符。
我选择|
逃避//
答案2
awk '/\.class/ && !/Class2/ {print "//", $0}
!(/\.class/ && !/Class2/) {print $0}' filename