Какова позиция POSIX awk в отношении нулевого байта в переменных/printf?

sedраствор:

Пример файлаinput.txt:

<a href="/url/version/tree/1.0.1alpha11" class="css-truncate">
<a href="/url/version2/tree1/1.0.2alpha11" class="css-truncate">
<a href="/url/version/tree/2.0stable" class="css-truncate">

sed -En 's@.*\<href="/[^[:space:]]+/([^/"[:space:]]+).*@\1@p' input.txt

Выход:

1.0.1alpha11
1.0.2alpha11
2.0stable
11
26.01.2020, 02:24
2 ответа

В спецификации POSIX.2018awk:

есть по крайней мере 4 релевантных фрагмента текста.

Выделение (полужирный текст )мой во всем цитируемом ниже тексте:

Input files to the awk program from any of the following sources shall be text files

Это означает, что если ввод содержит символы NUL (, что делает его не -текстом в соответствии с определением текста POSIX ), тогда поведение не указано.

\ddd : A <backslash> character followed by the longest sequence of one, two, or three octal-digit characters (01234567). If all of the digits are 0 (that is, representation of the NUL character), the behavior is undefined.

Итак, \000приводит к неопределенному поведению.

О сопоставлении регулярных выражений:

However, in all awk ERE matching, the use of one or more NUL characters in the pattern, input record, or text string produces undefined results

О printf/sprintf:

7. For the c conversion specifier character: if the argument has a numeric value, the character whose encoding is that value shall be output. If the value is zero or is not the encoding of any character in the character set, the behavior is undefined.

Итак, это еще один способ получить символ NUL, который приводит к неопределенному поведению.

Итак, подводя итог, в awkPOSIX говорит нам, что вы не можете использовать символ NUL переносимо, будь то для ввода, вывода или для сохранения в своих переменных.

gawk(по крайней мере с версии 2.10 в 1989 году, которая является самой ранней версией, которую я смог найти, где задокументирована поддержка NUL @ThomasDickeymawk(начиная с версии 20140914)две реализации, которые может иметь дело с NUL.

18
27.01.2020, 19:59

Строки C -в общем случае не могут содержать нулевые байты, а awkв основном является своего рода интерпретатором C. Утилита POSIX, которая может печатать нулевые байты, должна быть явно упомянута в стандарте POSIX. printfв awkне является таким случаем.

Следующие случаи явно перечислены в POSIX:

echo 'x\0000y'
printf 'x\000y\n'
printf '%b\n' 'x\0000y'

все три команды печатают четыре символа в сертифицированной ОС с торговой маркой POSIX UNIX.

В ваших awkпримерах используется неопределенное поведение.

-6
27.01.2020, 19:59

Теги

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