수치가 임계값보다 작을 경우 배경색 변경(html 형식)

수치가 임계값보다 작을 경우 배경색 변경(html 형식)

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>

20% 미만의 값을 찾아 배경을 빨간색으로 설정하고 싶습니다.

<td bgcolor="red">

sed 또는 다른 도구를 사용하십시오. 예를 들어,

<td>
80%
</td>

변함없이 유지되지만

<td>
19%
</td>

상처가 바뀌었다

<td bgcolor="red">
19%
</td>

지금까지 시도한 스크립트입니다.

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

답변1

나는 당신이 당신의 해결책을 이해하고 있다고 생각합니다.시바프라타의 답변, sed한 번 실행변경해야 하는 각 데이터 라인에 대해 (코드에서 실행 grepawk한 번 및 추가 제외 sed).

  • awk그리고 sed그것은 매우 강력한 명령입니다. 함께 사용하거나 와 함께 사용하는 경우는 거의 없습니다 grep.
  • awk줄번호를 알아두세요. grep -n를 사용하여 줄 번호를 생성한 다음 를 사용하여 처리하는 경우 awk아마도 필요한 것보다 더 많은 작업을 수행하고 있는 것입니다.
  • 명령을 실행하는 데 시간이 걸립니다. 파일 길이가 100줄이라면 SivaPrasath의 답변에 걸리는 시간을 눈치채지 못할 것입니다. 파일 길이가 백만 줄인 경우 SivaPrasath의 답변은 sed약 125,000번 실행됩니다. 이는 명백할 수도 있지만 반드시 필요한 것은 아닙니다.

'값'이 항상 다음과 같은 형식인 경우NN%NN00은 과 사이의 두 자리 십진 정수인 경우  다음 명령을 사용하여 모든 작업을 수행 19할 수 있습니다 .sed

sed '/<td>/ { N; s/\(<td\)\(>\n[01][0-9]%\)/\1 bgcolor="red"\2/; }' test.html

포함된 줄을 보면 <td>중괄호로 묶인 명령을 실행합니다. 파일에서 다음 줄(값이 포함된 줄)을 읽고 이를 패턴 공간에 추가합니다. 그런 다음 (백분율) 값이 일치하면(즉, ), (대체) 교체를 수행합니다.{}Ns<td><td bgcolor="red">[01][0-9]0019

값이 단일 숫자(예: 0through 9대신 00through 09)일 수 있는 경우 다음을 사용하세요.

sed '/<td>/ { N; s/\(<td\)\(>\n[0-9]%\)/\1 bgcolor="red"\2/; s/\(<td\)\(>\n[01][0-9]%\)/\1 bgcolor="red"\2/; }'

동일한 논리이지만 s한 자리 값에 대한 명령 하나와 두 자리 값에 대한 명령 하나가 있습니다. 또는 GNU(Linux 시스템의 표준)가 있는 경우 sed다음을 수행할 수 있습니다.

sed -r '/<td>/ { N; s/(<td)(>\n[01]?[0-9]%)/\1 bgcolor="red"\2/; }' test.html

확장된 정규식을 사용하여 [01]?[0-9] 일치시킵니다.누구나20보다 작은 한 자리 또는 두 자리 숫자입니다.

sed정수가 아닌 값(예 17.5%: ), 두 자리 이상의 값(앞에 0이 붙음), 음수를 처리할 수 있습니다. 만약 너라면질문을 수정하세요작업해야 할 양식을 나타내기 위해 이 섹션을 업데이트하겠습니다.


awk프로그램은 약간 장황하기는 하지만 한 줄에서 다른 줄로 정보를 쉽게 기억할 수 있게 해주기 때문에 더욱 강력합니다. 따라서 다음 스크립트는 여러 숫자 형식을 인식할 수 있습니다.

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

중간부터 읽기 시작하세요. 라인에 가 포함되어 있으면 <td>프로그램은 last_was_td플래그를 설정하고 다음 입력 라인으로 점프합니다. 그렇지 않으면 플래그가 지워지고 해당 줄이 인쇄됩니다. 이제 위에서부터 스크립트를 읽어보세요. 이전 줄이 a이고 <td>숫자( %필드 구분 기호로 구분된 첫 번째 필드)가 20보다 작으면 를 인쇄하고 <td bgcolor="red">, 그렇지 않으면 를 인쇄합니다 <td>. (값 자체는 print일반 명령문에 의해 인쇄됩니다 . 마지막에.)


위의 모든 답변은 수정된 파일을 표준 출력에 기록합니다. 아시다시피 sed -i.을 사용 awk하여 출력을 임시 파일에 쓰고 다시 입력 파일에 복사할 수 있습니다.

답변2

이 시도,

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

답변3

사용행복하다(이전 Perl_6)

raku -e 'put S:g/^^ (\< td) \> $$ \n ^^ (<digit>**2) \% $$ /{$1 < 20 ?? "$0 bgcolor=\"red\">\n$1" !! "$0>\n$1"}/ given lines.join("\n");' 

#OR

raku -e 'put S:g[^^ (\< td) \> $$ \n ^^ (<digit>**2) \% $$] = $1 < 20 ?? "$0 bgcolor=\"red\">\n$1" !! "$0>\n$1" given lines.join("\n");' 

또는

raku -e 'put S:g/^^ (\< td) \> $$ \n ^^ (<digit>**2) \% $$ /{$1 < 20 ?? "$0 style=\"background-color:#ff0000;\">\n$1" !! "$0>\n$1"}/ given lines.join("\n");'

#OR

raku -e 'put S:g[^^ (\< td) \> $$ \n ^^ (<digit>**2) \% $$] = $1 < 20 ?? "$0 style=\"background-color:#ff0000;\">\n$1" !! "$0>\n$1" given lines.join("\n");' 

예제 1과 2는 으로 대체됩니다 bgcolor="red". 예제 3과 4는 -in으로 대체되어 style="background-color:#ff0000;"최신 브라우저에서 작동하는 html을 생성합니다.

간단히 말해서, 이 예제에서는 Raku의"빅S"교체 연산자(문서에 따름),"원래 문자열을 그대로 유지하고 $/(일치 변수) 대신 결과 문자열을 반환합니다.".

행복하다"빅S"위의 4가지 예 모두에서 연산자는 Raku의 삼항 연산자와 함께 사용됩니다. Raku의 삼항 연산자의 철자는 "'조건' ??'True' !!'False'"입니다.

예제 1과 3은 S/old/new/Raku에서 오른쪽 절반에 코드 블록을 사용할 수 있는 전통적인 형식을 사용합니다. 예제 2와 4 는 (설명된 대로) 삼항 연산자 및/또는 조건문(기본적으로 중괄호가 없는 코드 블록)을 사용할 수 있는 보다 현대적인 S[old] = "new"또는 대체 연산자 형식을 사용합니다.S[old] = [new]

https://docs.raku.org/syntax/S$SOLIDUS$SOLIDUS$SOLIDUS
https://docs.raku.org/언어/operators#index-entry-operator_ternary
https://raku.org

관련 정보