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
Выделение (полужирный текст )мой во всем цитируемом ниже тексте:
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, который приводит к неопределенному поведению.
Итак, подводя итог, в awk
POSIX говорит нам, что вы не можете использовать символ NUL переносимо, будь то для ввода, вывода или для сохранения в своих переменных.
gawk
(по крайней мере с версии 2.10 в 1989 году, которая является самой ранней версией, которую я смог найти, где задокументирована поддержка NUL )и @ThomasDickeymawk
(начиная с версии 20140914)две реализации, которые может иметь дело с NUL.
Строки C -в общем случае не могут содержать нулевые байты, а awk
в основном является своего рода интерпретатором C. Утилита POSIX, которая может печатать нулевые байты, должна быть явно упомянута в стандарте POSIX. printf
в awk
не является таким случаем.
Следующие случаи явно перечислены в POSIX:
echo 'x\0000y'
printf 'x\000y\n'
printf '%b\n' 'x\0000y'
все три команды печатают четыре символа в сертифицированной ОС с торговой маркой POSIX UNIX.
В ваших awk
примерах используется неопределенное поведение.