[Оригинал — в news:relcom.comp.os.unix; копия — авторам ответов.]
Комментарии к ответам на вопросы (решениям задач) по курсу на
неделю 46 [1]. Получено в общей сложности 7 ответов: 5 на
варианты задания 1, 2 на варианты задания 2.
Оценки (в порядке уменьшения): 5 5 4 3 3 3 -.
[1]
http://am-1.org/~ivan/inco-2019/wa/46.ru.xhtml
1. Регулярные выражения.
Строка начинается на произвольное (включая 0) количество
пробельных символов, за которыми следует одна или более цифр и
хотя бы один пробельный символ.
В решении почему-то напрочь отсутствуют /символы повторения/ (*,
\{\}, etc.) Очевидно, такое регулярное выражение не реализует
условие выше.
С другой стороны, используются \S, \d, \s — которые являются
распространенными расширениями, но, строго говоря, POSIX не
описываются.
Итог: 3.
Строка содержит хотя бы один символ из множества aeiou, но не
заканчивается ни на такой, ни на пробельный символы.
В решении оба регулярных выражения даны в контексте программы на
Awk. Однако, POSIX Awk всегда использует (вариант) ERE, и никогда
не BRE [2]. Кроме того, не использована обязательная в этом RE
форма «$» («конец строки»); список исключений [^…] (?) использован
неверно; форма (нечто){0} не имеет смысла.
Итог: 3.
[2]
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html
Строка не соответствует регулярному выражению ^$.
В ответе приведен верный анализ выражения ^$ — но /не/ приведено
требуемого заданием регулярного выражения, реализующего данное
условие («строка не соответствует выражению ^$».)
Итог: 3.
Строка начинается с целого положительного числа в десятичной
записи, за которым следует запятая и произвольное (включая 0)
количество произвольных символов.
В решении ошибочно заявлено, что нет различий между BRE и ERE.
Однако, символ «+» является особым только в ERE; в BRE, напротив,
он понимается буквально [3], и вместо него следует использовать
\{1,\}.
Кроме того, решение буквально реализует критерий «произвольное
количество произвольных символов» из задания — что неоптимально.
На самом деле, регулярному выражению «,.*» соответствуют ровно
те же строки, что и более простому «,».
Итог: 4.
[3]
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03
Строка начинается с косой черты (/) и состоит исключительно из
разделенных ею же непустых алфавитноцифровых последовательностей
(например: /привет/мир.)
В тексте выше, точка после «мир» не является частью примера
(идет после элемента <code /> в документе.) В остальном — в
предложенных BRE, ERE ошибок не нахожу.
Итог: 5.
2. Преобразование текста.
Исходный текст: Целевой текст:
1571374521 wa/42.ru.xhtml wa/42.ru.xhtml
1571973477 wa/43.ru.xhtml wa/43.ru.xhtml
1573184146 wa/45.ru.xhtml wa/45.ru.xhtml
В предложенном решении, команда echo $varname сформирует
единственную строку текста (если не менять IFS — чего сделано
не было) — при требуемых выше трех.
Тем не менее, команда GNU Sed применена верно. (Хотя на зачете
мне бы хотелось видеть POSIX Sed.)
Итог: 5.
Исходный текст: Целевой текст:
<ol> <ol>
<li><p>Привет, мир!</p></li> <li ><p >Привет, мир!</p></li>
</ol> </ol>
В задании требуется расставить определенным образом пробелы
в открывающих тегах XML (для улучшения читаемости кода.)
Особенность здесь в том, что соответствующее POSIX RE обязательно
«захватит» текст, следующий за тегом — которым, в свою очередь,
может оказаться еще один открывающий тег — <li>< → <li >< — который,
тем самым, «потеряется» для следующей итерации s///g.
Решение — повторить команду s///g дважды. (Или использовать
PCRE — где они доступны.)
В предложенном решении сделана попытка извлечь содержимое
элемента — что во-первых не соответствует заданию; во-вторых
— задача куда как более сложная (поскольку элемент XML может
занимать более одной строки — что, по-видимому, придется
учитывать в Sed-коде явно); в-третьих — задачу извлечения
предложенный код тоже не решает.
Итог: не зачтено.
--
FSF associate member #7257
http://am-1.org/~ivan/