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の回答にかかる時間に気付くことはありません。ファイルの長さが100万行の場合、SivaPrasathの回答は
sed
約125,000回実行されます。これは明らかかもしれませんが、必ずしも必要ではありません。
「値」が常に次の形式の場合NN%
NN
00
は、との間の2桁の10進整数の場合は、次のコマンドを使用してすべての操作を実行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
through9
ではなく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
1 桁の値に対する 1 つのコマンドと 2 桁の値の 1 つのコマンドがあります。または、GNU(Linuxシステムの標準)がある場合は、sed
次のことを実行できます。
sed -r '/<td>/ { N; s/(<td)(>\n[01]?[0-9]%)/\1 bgcolor="red"\2/; }' test.html
拡張正規表現を使用して[01]?[0-9]
一致させます。誰でも20未満の1桁または2桁の数字。
sed
整数以外の値(例17.5%
:)、2桁以上の値(前にゼロが付く)、負の数を処理できます。もしあなたなら質問を編集してください作業する必要があるフォームを示すためにこのセクションを更新します。
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の三項演算子のスペルは「条件」??
「真」!!
「偽」です。
例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