Regex para o comando sed / awk

0

Eu gostaria de alterar o conteúdo do arquivo que eu especifiquei como abaixo.Eu quero comentar todas as linhas que contém ".class", exceto o nome da classe que eu forneço.

@MyClass1.MyClass2(value = {
    Class1.class,
    Class2.class,
    Class3.class,
    Class4.class
})
public class Foo {}

Por exemplo, se eu fornecer Class2 como parâmetro para

sed -i -E 's/some_regex/Class2/g'

comando, o resultado deve ser assim,

@MyClass1.MyClass2(value = {
    //Class1.class,
    Class2.class,
    //Class3.class,
    //Class4.class
})
public class Foo {}

Qual regex devo usar para isso?

    
por aekber 15.11.2018 / 20:52

2 respostas

1

Para um arquivo como este:

$ 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 {}

Você pode ter este resultado:

$ 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 {}

Explicação:

'/@MyClass1.MyClass2(*/,/})/ {....} - > intervalo para operar no formulário /from/,/to/{actions}

{s|\sClass.*|//&|g; - > aplique // em todas as linhas, começando com whitespace \s e, em seguida, Class

/Class2/{s|//||} - > remova // para Class2

Dica: No sed nós podemos usar qualquer caractere como um separador para s/replacethis/withthat/ synthax.
Eu escolho | para evitar o escape de //

    
por 15.11.2018 / 21:31
1
awk '/\.class/ && !/Class2/ {print "//", $0}
     !(/\.class/ && !/Class2/) {print $0}' filename
    
por 15.11.2018 / 21:09