$ (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
text-processing
Авинаш Радж
источник
источник
Ответы:
Это, по общему признанию, загадочные
sed
команды. Конкретно (сman sed
):Итак, скрипт, который вы разместили, может быть разбит на (пробелы добавлены для удобства чтения):
По сути, то, что это делает, можно записать в псевдокоде как
Вы можете понять это немного лучше с более сложным примером ввода:
Я не совсем уверен, зачем
!$
это нужно. Насколько я могу судить, вы можете получить тот же результат систочник
$!
не так!$
. Впрочем, так может и быть,!N
и нет$!
.!N
или$!
. Итак, я все еще продолжаю думать о том, смотрит ли последняя строка на новую строку или EOF.$!
качестве адреса «диапазона» с оператором постфикса комплемента - так$!N
(делаютN
везде , кроме адреса$
) действительно имеет тот же синтаксис , как что - то вродеm,n!d
(удалить все , кроме линийm
доn
).:
является аналогомgoto
метки, и на самом деле:
раньше использовался как метка goto в оболочке Томпсона, так что это было бы знакомо людям, использующим как sed, так и оболочку ТомпсонаЯ отправляю этот ответ , так как я вижу много путаницы относительно почему последняя строка исключается при выполнении
N
(через адресации строки строки$!
) и потому , что ОП был смущен о значении:a;$!N;
в виде SED команды , а не только в к одной конкретной он отвечал ,Что ж, преимущество использования
$!N
вместоN
не является очевидным в предложенных примерах (OP и @terdon), поскольку в последней строке послеN
команды «важная» (продолжайте чтение) команда не выполняется . (Действительно, результат тот же, если удалить этот адрес строки.)В более сложном примере (например, замена
this sentence
в файле, когда два слова появляются иногда в одной строке, а некоторые другие в двух строках), исключение последней строки дляN
команды может иметь решающее значение! Если последняя строка не исключена, при выполненииN
на нейsed
происходитEOF
немедленное нажатие клавиш и выход, что препятствует выполнению всех последующих команд (в том числе команд ветвления, а именноt
иb
).В показанных слишком упрощенных примерах мы можем безопасно удалить
$!
и разрешитьsed
сбой при выполненииN
и возврате, поскольку прерваннаяs
команда ничего не сделает, если она будет выполнена, так как нет\n
совпадений.источник