Como removo todos os números que estão rodeados por

4

Eu tentei isso

sed -i '' 's/[0-9]*<>/g'

Mas não funcionou.

Arquivo de exemplo:

<Number1>
</Number8>

saída:

<Number>
</Number>
    
por DisplayName 28.10.2014 / 14:26

4 respostas

2

Os seguintes trabalhos:

sed -i 's/\(<[^0-9>]*\)[0-9]*\([^0-9]*>\)//g' filename
    
por 28.10.2014 / 14:40
3

Isso é realmente fácil de fazer com sed , na verdade. Você pode obter o máximo que puder de uma só vez e, em seguida, t ry, t ry novamente:

sed -e :t -e 's/\(<[^<]*\)[0-9]\{1,\}\([^>]*>\)//g;tt'

Eu tentei com os seguintes bits aleatórios de entrada:

<Number1>
234234 </Nu994845mb6er8>'
234234 <000000000000000000000000000000000000>>
<a1> 2 <34b5c> 6 7 def

E os resultados foram:

<Number>
234234 </Number>
234234 <>>
<a> 2 <bc> 6 7 def

O regex corresponde apenas a pelo menos um número entre um < e um > . Continua a substituir essa seqüência numérica sem nada até que não consiga mais fazer isso com sucesso. Essa é a finalidade do comando t est.

Senão você pode fazer isso sem um loop como:

sed 's/^/>/;s/\(>[^<>]*\)*[0-9]*//g;s/.//' <<\INPUT        
<Number1>
234234 </Nu994845mb6er8>'
234234 <000000000000000000000000000000000000>>
<a1> 2 <34b5c> 6 7 def
INPUT

OUTPUT

<Number>
234234 </Number>'
234234 <>>
<a> 2 <bc> 6 7 def

Ele sempre ignorará > até encontrar um < , afetando apenas <[^<>]*> groups. Consulte este se estiver interessado no motivo.

    
por 29.10.2014 / 07:31
2

Você precisa de um loop em torno de um comando de substituição (possível em sed e perl) ou de um comando de substituição aninhado (somente perl). Eu prefiro a última abordagem; é um pouco mais geral:

perl -pe 's/\<([^>]*)\>/do{$a = $1; $a =~ s,\d,,g; "\<" . $a . "\>"}/ge;'

Exemplo de entrada:

<a1> 2 <34b5c> 6 7 def

Saída:

<a> 2 <bc> 6 7 def

Explicação: A opção -p diz que queremos ler o arquivo linha por linha, executar o script para cada linha e imprimir o resultado (como em sed); -e significa que o próximo argumento é o script a ser executado.

Essencialmente, o script é apenas um comando de substituição: procuramos < , seguido por qualquer número de caracteres que não sejam > , seguidos por > . O e modificador após o / à direita indica um recurso especial do comando de substituição: Sua peça de substituição não é uma sequência a ser impressa, mas novamente uma sequência de comando a ser executada. Nesta sequência de comandos, primeiro atribuímos a string entre < e > (ou seja, $1 ) a uma nova variável $a , depois executamos outro comando de substituição em $a que simplesmente substitui cada dígito ( \d ) por nada, e finalmente retorna < , seguido pela string modificada, seguida por > . O modificador g (ambos após o / e o , ) significa que os comandos de substituição devem ser executados para cada sequência de correspondência, não apenas para a primeira.

Se a abertura < e o correspondente > puderem estar em linhas diferentes, digamos

<abc1
opt="def">

adicione a opção -0777 (ou seja, perl -0777 -pe '...' ), para que perl leia todo o arquivo antes de processá-lo, em vez de trabalhar linha por linha ( modo slurp ).

    
por 28.10.2014 / 15:07
1

via sed curta

sed 's/<\([^>]\+\)[0-9]\+>/<>/g' file
    
por 28.10.2014 / 16:38