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