Что является значением: a; $! N; в команде sed?

$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere

Выше sed управляйте заменяет символ новой строки строкой "строка". Но я не знаю значение :a;$!N;s/\n/string/;ta в одинарных кавычках. Я знаю среднюю часть s/\n/string/. Но я не знаю функции первых (:a;$!N;) и в последний раз (ta) часть.

10
задан 11 May 2014 в 16:20

2 ответа

Это, по общему признанию загадочно, sed команды. Конкретно (от man sed):

: маркировка
        Маркировка для b и команд t.

t маркировка
        Если s///сделал успешную замену, так как последняя входная строка была считана и начиная с последнего t или команды T, то перейдите для маркировки; если маркировка опущена, ответвление к концу сценария.

n N        Читал/добавлял следующую строку входа в пространство шаблона.

Так, сценарий, который Вы отправили, может быть сломан на (пробелы, добавленные для readbility):

sed ':a;  $!N;  s/\n/string/;  ta'
     ---  ----  -------------  --
      |     |        |          |--> go back (`t`) to `a`
      |     |        |-------------> substitute newlines with `string`
      |     |----------------------> If this is not the last line (`$!`), append the 
      |                              next line to the pattern space.
      |----------------------------> Create the label `a`.

В основном то, что это делает, могло быть записано в псевдокоде как

while (not end of line){
    append current line to this one and replace \n with 'string'
}

Можно понять это немного лучше с более сложным входным примером:

$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5

Я не действительно уверен почему !$ необходим. Насколько я могу сказать, можно получить тот же вывод с

printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'
17
ответ дан 16 November 2019 в 15:32

Я отправляю этот ответ, так как я вижу много беспорядка о том, почему последняя строка исключена при выполнении N (через строку обращения строки $!) и потому что OP был перепутан значением :a;$!N; в команде sed не только в определенной он отправил.

Ну, преимущество использования $!N вместо N не evindent в предложенных примерах (OP и @terdon), с тех пор не "важный" (продолжайте читать), команда выполняется на последней строке после N команда. (Действительно, результатом является то же, если Вы снимаете изоляцию с того адреса строки.)

В более сложном примере (например, замена this sentence в файле, с этими двумя словами, появляющимися иногда на одной строке и некоторые другие времена на двух строках), исключая последнюю строку для N команда могла быть крайне важной! Если последняя строка не исключена после выполнения N на нем, sed хиты EOF и выходы сразу, предотвращая все последующие команды (переходящий команды также, а именно, t и b) выполняться.

В слишком упрощенных показанных примерах мы можем безопасно удалить $! и позвольте sed сбой в выполнении N и возвратитесь начиная с прерванного s команда ничего не сделала бы, если бы она выполнялась, так как существует нет \n соответствовать.

0
ответ дан 23 November 2019 в 04:25

Другие вопросы по тегам:

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