$ (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
) часть.
Это, по общему признанию загадочно, 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'
Я отправляю этот ответ, так как я вижу много беспорядка о том, почему последняя строка исключена при выполнении N
(через строку обращения строки $!
) и потому что OP был перепутан значением :a;$!N;
в команде sed не только в определенной он отправил.
Ну, преимущество использования $!N
вместо N
не evindent в предложенных примерах (OP и @terdon), с тех пор не "важный" (продолжайте читать), команда выполняется на последней строке после N
команда. (Действительно, результатом является то же, если Вы снимаете изоляцию с того адреса строки.)
В более сложном примере (например, замена this sentence
в файле, с этими двумя словами, появляющимися иногда на одной строке и некоторые другие времена на двух строках), исключая последнюю строку для N
команда могла быть крайне важной! Если последняя строка не исключена после выполнения N
на нем, sed
хиты EOF
и выходы сразу, предотвращая все последующие команды (переходящий команды также, а именно, t
и b
) выполняться.
В слишком упрощенных показанных примерах мы можем безопасно удалить $!
и позвольте sed
сбой в выполнении N
и возвратитесь начиная с прерванного s
команда ничего не сделала бы, если бы она выполнялась, так как существует нет \n
соответствовать.