Измените цвет фона (формат HTML), если число меньше порогового значения

[foldername1]
valid users=username1
public = no
writable = yes
browseable =yes
printable = no
create mask = 0755

[foldername2]
valid users=username1
public = no
writable = yes
browseable =yes
printable = no
create mask = 0755
1
16.08.2018, 06:00
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
0
28.01.2020, 00:33

Я полагаю, вы понимаете, что ваше решение и ответ ШиваПрасата , запустить sedодин раз для каждой строки данных, которую необходимо изменить (в дополнение к однократному запуску grepи awkи, в вашем коде, дополнительныйsed).

  • awkи sed— очень мощные команды. Вы вряд ли когда-нибудь будете использовать их вместе или вместе с grep.
  • awkзнает о номерах строк. Если вы обнаружите, что используете grep -nдля генерации номеров строк, а затем обрабатывая их с помощью awk, вы, вероятно, делаете больше работы для себя, чем вам нужно.
  • Выполнение команд требует времени. Если ваш файл состоит из 100 строк, вы, вероятно, не заметите, сколько времени займет ответ ШиваПрасата. Если ваш файл состоит из миллиона строк, Ответ ШиваПрасата будет повторяться 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до 9, а не от 00до 09), затем используйте

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

что является той же логикой, но с одной командой sдля обработки однозначных значений -и один для обработки двузначных -значений. Или, если у вас есть стандарт GNUsed(для систем Linux ), вы можете сделать

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

который использует расширенное регулярное выражение [01]?[0-9]для соответствия либо однозначному -значению, либо двузначному -значению меньше 20.

sedможет обрабатывать не -целые числа (, например, 17.5%), значения с более чем двумя цифрами (с ведущими нулями )и отрицательными числами. Если вы отредактируете свой вопрос , чтобы указать, какие формы вам нужно обработать, Я обновлю этот раздел.


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и переходит к следующей строке ввода. В противном случае флаг сбрасывается и строка печатается. Теперь читаем скрипт сверху :, если предыдущая строка была <td>, и число (первого поля, разделенное разделителем полей %), меньше 20, мы печатаем <td bgcolor="red">; в противном случае мы печатаем <td>. (Само значение выводится общим оператором printв конце.)


Все приведенные выше ответы записывают измененный файл в стандартный вывод. Как вы знаете, вы можете изменить файл на месте с помощью sed -i. С помощью awkзапишите вывод во временный файл и скопируйте его обратно поверх входного файла.

0
28.01.2020, 00:33

Теги

Похожие вопросы