sed/awk 命令的正则表达式

sed/awk 命令的正则表达式

我想更改我指定的文件内容,如下所示。我想注释掉除我提供的类名之外的所有包含“.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

相关内容