Os seguintes trabalhos:
sed -i 's/\(<[^0-9>]*\)[0-9]*\([^0-9]*>\)//g' filename
Eu tentei isso
sed -i '' 's/[0-9]*<>/g'
Mas não funcionou.
Arquivo de exemplo:
<Number1>
</Number8>
saída:
<Number>
</Number>
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
<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.
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 ).
via sed curta
sed 's/<\([^>]\+\)[0-9]\+>/<>/g' file
Tags bash text-processing awk sed