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