Tente isso,
number=('grep -n "^[0-1][0-9]" test.html | awk -F ':' '{a=$1-1;print a}'')
for i in ${number[@]}
do
sed -i "$i s/.*/<td bgcolor=\"red\">/" test.html
done
Eu tenho o arquivo seguinte, chamado test.html:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="generator" content="SQL*Plus 12.2.0">
<style type='text/css'> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} p {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} table,tr,td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;} th {font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; padding:0px 0px 0px 0px;} h1 {font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;-
} h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;}</style><title>SQL*Plus Report</title>
</head>
<body>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
NAME
</th>
<th scope="col">
FREE_PERCENT
</th>
</tr>
<tr>
<td>
DG_BACKUP
</td>
<td>
50%
</td>
</tr>
<tr>
<td>
DG_DATA
</td>
<td>
96%
</td>
</tr>
<tr>
<td>
DG_INDEX
</td>
<td>
80%
</td>
</tr>
<tr>
<td>
DG_ORA
</td>
<td>
19%
</td>
</tr>
</table>
<p>
<br>
</body>
</html>
Eu quero encontrar os valores que são menores que 20% e definir o plano de fundo para vermelho:
<td bgcolor="red">
usando sed ou qualquer outra ferramenta. Então, por exemplo,
<td>
80%
</td>
permaneceria inalterado, mas
<td>
19%
</td>
ferida ser mudada para
<td bgcolor="red">
19%
</td>
Script que tentei até agora.
number_of_lines_test=('grep -n % test.html |sed -e '1d' |awk -F"[:%]" '{if ($2 <= 50) print $1}'')
for i in 'seq 0 $((${#number_of_lines_test[@]} - 1))'
do
sed -i -e "$((${number_of_lines_test[i]} - 1))s/<td>/<td bgcolor=\"red\">/" test.html
done
Tente isso,
number=('grep -n "^[0-1][0-9]" test.html | awk -F ':' '{a=$1-1;print a}'')
for i in ${number[@]}
do
sed -i "$i s/.*/<td bgcolor=\"red\">/" test.html
done
Suponho que você entenda que sua solução e a resposta do SivaPrasath ,
executar sed
once para cada linha de dados que precisa ser alterada
(além de executar grep
e awk
uma vez e, no seu código, um sed
extra).
awk
e sed
são comandos muito poderosos.
Você quase nunca os usa juntos ou junto com grep
. awk
sabe sobre números de linha.
Se você se encontrar usando grep -n
para gerar números de linha,
e, em seguida, processando-os com awk
,
você provavelmente está fazendo mais trabalho para si mesmo do que precisa. sed
aproximadamente 125.000 vezes.
Isso provavelmente será perceptível e desnecessário. Se o "valor" sempre estará no formato NN%
,
onde NN
é um número inteiro decimal de dois dígitos entre 00
e 19
,
você pode fazer tudo com esse comando sed
:
sed '/<td>/ { N; s/\(<td\)\(>\n[01][0-9]%\)/ bgcolor="red"/; }' test.html
Quando vir uma linha que contenha <td>
,
ele executa os comandos nas chaves {
… }
.
N
lê a próxima linha do arquivo (aquela que contém o valor)
e acrescenta-o ao espaço do padrão.
Em seguida, ele faz um s
(substituto) que substitui <td>
por <td bgcolor="red">
se o valor (porcentagem) corresponder a [01][0-9]
(ou seja, 00
a 19
).
Se o valor puder ser um único dígito
(por exemplo, 0
a 9
em vez de 00
a 09
), use
sed '/<td>/ { N; s/\(<td\)\(>\n[0-9]%\)/ bgcolor="red"/; s/\(<td\)\(>\n[01][0-9]%\)/ bgcolor="red"/; }'
que é a mesma lógica,
mas com um comando s
para manipular valores de dígito único
e um para lidar com valores de dois dígitos.
Ou, se você tem o GNU sed
(padrão em sistemas Linux), você pode fazer
sed -r '/<td>/ { N; s/(<td)(>\n[01]?[0-9]%)/ bgcolor="red"/; }' test.html
que usa a expressão regular estendida [01]?[0-9]
para combinar um valor de dígito único ou um valor de dois dígitos menor que 20.
sed
pode manipular não-inteiros (por exemplo, 17.5%
)
valores com mais de dois dígitos (com zeros à esquerda) e números negativos.
Se você edite sua pergunta para indicar quais formulários você precisa processar,
Atualizarei esta seção.
awk
programas, embora um pouco mais detalhados, são muito mais poderosos,
como eles podem lembrar facilmente informações de uma linha para outra.
Portanto, o script abaixo reconhece uma ampla variedade de formas numéricas:
awk -F% '
last_was_td {
if ($1 < 20) print "<td bgcolor=\"red\">"
else print "<td>"
}
{ last_was_td = 0 }
/<td>/ {
last_was_td = 1
next
}
{ print }
' test.html
Comece a ler no meio.
Se uma linha contiver <td>
,
o programa define o sinalizador last_was_td
e pula para a próxima linha de entrada.
Caso contrário, o sinalizador é apagado e a linha é impressa.
Agora, lendo o script a partir do topo: se a linha anterior foi um <td>
,
e o número (o primeiro campo, dividido pelo separador de campo %
) é menor que 20,
nós imprimimos <td bgcolor="red">
; caso contrário, imprimiremos <td>
.
(O valor em si é impresso pela declaração geral print
no final.)
Todas as respostas acima escrevem o arquivo revisado na saída padrão.
Como você sabe, você pode modificar o arquivo no local com sed -i
.
Com awk
, grave a saída em um arquivo temporário e copie-o de volta no arquivo de entrada.
Tags text-processing perl awk sed html