Como remover parte de uma string

2

Eu continuo lendo a documentação de sed e muitos posts, mas não consigo descobrir isso. Eu tenho um grande número de arquivos Java. Nesses arquivos são chamadas para um método que leva a enumeração convertida em um inteiro usando o método toInt() . Eu quero passar por todos os arquivos e me livrar de .toInt() para uma enumeração específica.

Isso é o que eu quero. As strings do código original:

foo(ENUM_NAME.ENUM_VALUE.toInt(), arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2.toInt(), arg2, arg3)

Eu quero acabar com:

foo(ENUM_NAME.ENUM_VALUE, arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2, arg2, arg3)

ENUM_VALUE pode ter centenas de possibilidades diferentes, por isso não posso codificar. Parece que há alguma confusão sobre o que precisa mudar, então tentarei ser mais claro.

Existe uma enumeração chamada TRANF_FIELD em meus arquivos Java. Os valores disponíveis para essa enumeração podem ser um de dois mil valores, seguidos por .toInt() . Eu preciso me livrar do .toInt() . Os nomes das funções são todos irrelevantes.

A seguir, exemplos de construções de código que são intercaladas em todo o meu código Java e como eles devem ser processados:

TRANF_FIELD.TRANF_VALUE_1.toInt()
                I want the .toInt() deleted, leaving TRANF_FIELD.TRANF_VALUE_1 left over.
TRANF_FIELD.TRANF_KILL_ME.toInt()
                I want the .toInt() deleted, leaving TRANF_FIELD.TRANF_KILL_ME
TRANG_FIELD.TRANG_VALUE_1.toInt()
                No change, because it's not TRANF_FIELD.
TRANF_FIELD.TRANF_VALUE_1.length()
                No change, because it's not .toInt().

    
por Chris 07.10.2014 / 17:08

4 respostas

1

Você parece querer alterar todas as ocorrências de

TRANF_FIELD.some_enum_value.toInt()

para

TRANF_FIELD.that_enum_value

enquanto deixa outras enumerações (por exemplo, TRANG_FIELD.TRANG_VALUE.toInt() ) e outros métodos (por exemplo, TRANF_FIELD.TRANF_VALUE.length() ) sozinhos. Isso parece simples:

sed 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()//'

onde

  • [A-Za-z0-9_]* é qualquer número de caracteres alfanuméricos (incluindo sublinhados). Isso se destina a corresponder a qualquer valor de enumeração válido. Na verdade, [A-Za-z_][A-Za-z0-9_]* seria melhor, porque [A-Za-z0-9_]* pode corresponder a uma string vazia ou a uma que começa com um dígito.
  • \(\) agrupa o nome da enumeração ( TRANF_FIELD ), o período literal ( \. ), e o valor de enumeração (do primeiro marcador).
  • significa "substituir a string completa que você encontrou com o primeiro grupo", ou seja, descarte a parte .toInt() .
  • Para lidar com várias ocorrências por linha, adicione g (global) após a última barra.
  • Isso não manipulará espaço em branco incorporado, por exemplo, TRANF_FIELD . TRANF_VALUE . Consertar isso é deixado como um exercício.
  • Isso não manipulará expressões que estão quebradas nas linhas; por exemplo,

        i = TRANF_FIELD
                 .TRANF_VALUE.toInt();
    

    Isso é mais difícil de corrigir.

por 07.10.2014 / 18:19
1

Obrigado pela ajuda de todos. Eu adicionei o -i de uma resposta, incluindo o caminho para todos os arquivos java, para o que o G-man sugeriu e funciona. Se vocês estiverem em Long Island, vou comprar uma cerveja pra você. Isso me salvou um monte de tempo.

sed -i 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()//g' 
    
por 07.10.2014 / 19:36
0

Dependendo do seu sistema operacional, um inline ( -i ) sed poderia fazer isso:

sed -i 's:\.toInt()::' filename

Onde ele substituirá apenas a instância de ".toInt ()" por "" - o . é salvo para que não aja como um curinga.

Como você mencionou vários arquivos, você terá que fazer o loop desse comando procurando por todos os arquivos no diretório atual e subdiretórios:

find . -type f -exec sed -i 's:\.toInt()::' {} \;

No entanto, isso causará um erro se os nomes dos arquivos contiverem espaços, portanto, podemos usar o comando xargs para lidar com isso, o que colocará aspas em torno de todos os nomes de arquivos:

find . -type f | xargs -I{} sed -i 's:\.toInt()::' "{}"

No entanto, isso também selecionará os arquivos compilados, então, para evitar isso, podemos usar um recurso útil em perl para ignorá-los:

find . -type f | perl -nle 'print if -T' | xargs -I{} sed -i 's:\.toInt()::' "{}"

    
por 07.10.2014 / 18:26
-1
sed 's/ENUM_NAME\.\(.*\)\.toInt()/ENUM_NAME./g' 
    
por 07.10.2014 / 18:07