![수치가 임계값보다 작을 경우 배경색 변경(html 형식)](https://linux55.com/image/135779/%EC%88%98%EC%B9%98%EA%B0%80%20%EC%9E%84%EA%B3%84%EA%B0%92%EB%B3%B4%EB%8B%A4%20%EC%9E%91%EC%9D%84%20%EA%B2%BD%EC%9A%B0%20%EB%B0%B0%EA%B2%BD%EC%83%89%20%EB%B3%80%EA%B2%BD(html%20%ED%98%95%EC%8B%9D).png)
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
한 번 실행변경해야 하는 각 데이터 라인에 대해
(코드에서 실행 grep
및 awk
한 번 및 추가 제외 sed
).
awk
그리고sed
그것은 매우 강력한 명령입니다. 함께 사용하거나 와 함께 사용하는 경우는 거의 없습니다grep
.awk
줄번호를 알아두세요.grep -n
를 사용하여 줄 번호를 생성한 다음 를 사용하여 처리하는 경우awk
아마도 필요한 것보다 더 많은 작업을 수행하고 있는 것입니다.- 명령을 실행하는 데 시간이 걸립니다. 파일 길이가 100줄이라면 SivaPrasath의 답변에 걸리는 시간을 눈치채지 못할 것입니다. 파일 길이가 백만 줄인 경우 SivaPrasath의 답변은
sed
약 125,000번 실행됩니다. 이는 명백할 수도 있지만 반드시 필요한 것은 아닙니다.
'값'이 항상 다음과 같은 형식인 경우NN%
NN
00
은 과 사이의 두 자리 십진 정수인 경우 다음 명령을 사용하여 모든 작업을 수행 19
할 수 있습니다 .sed
sed '/<td>/ { N; s/\(<td\)\(>\n[01][0-9]%\)/\1 bgcolor="red"\2/; }' test.html
포함된 줄을 보면 <td>
중괄호로 묶인 명령을 실행합니다. 파일에서 다음 줄(값이 포함된 줄)을 읽고 이를 패턴 공간에 추가합니다. 그런 다음 (백분율) 값이 일치하면(즉, ), (대체) 교체를 수행합니다.{
}
N
s
<td>
<td bgcolor="red">
[01][0-9]
00
19
값이 단일 숫자(예: 0
through 9
대신 00
through 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