Что \ n \ nnd должен делать? - PullRequest
3 голосов
/ 25 марта 2020
echo n | sed '\n\nnd'

При использовании GNU sed приведенная выше команда печатает n. Напротив, BSD sed ничего не печатает.

POSIX sed spe c говорит:

  • В контексте адреса, конструкция \cBREc, где c - любой символ, отличный от или , должна быть идентична /BRE/. Если символ, обозначенный c, появляется после , то он считается тем буквальным символом, который не должен заканчиваться BRE. Например, в контекстном адресе \xabc\xdefx второй x обозначает себя, так что BRE равен abcxdef.

  • escape-последовательность \n должна соответствовать встроено в пространство шаблона. Литерал не должен использоваться в BRE контекстного адреса или в функции замены.

Но он не раскрывает противоречие, вызванное этими утверждениями.

Мой вопрос: какой из них является правильным поведением? напечатать n или ничего? Или, выбор преднамеренно оставлен разработчикам?


Очевидно, что GNU sed трактует \n иначе, чем другие escape-последовательности:

$ echo t | sed 'st\ttt' | xxd
00000000: 0a                                       .
$
$ echo n | sed 'sn\nnn' | xxd
00000000: 6e0a                                     n.

1 Ответ

0 голосов
/ 27 марта 2020

Согласно ответу Джеффа Клэра (ниже) на мою почту в списке рассылки Austin Common Standards Revision Group, вывод заключается в том, что стандарт неясен в этом, и оба поведения верны. HP-UX и Solaris приняли ту же практику, что и GNU, поэтому это не ошибка в реализациях, а отсутствие ясности в стандарте.

Ни один из них не является более правильным, чем другой, потому что, как вы сказали, сам стандарт неясен. Формальная интерпретация гласит: «Стандарт неясен в этом вопросе, и нельзя проводить различий в соответствии между альтернативными реализациями, основанными на этом».

Учитывая, что реализации различаются, мы, вероятно, должны сделать поведение явно неуказанным.

Если в системе отслеживания ошибок появляется предложение обновить стандарт с явным указанием, что это не указано, я отредактирую это, чтобы добавить ссылку на него.

...