Sed работает построчно, поэтому сложно добавить кому к предыдущей строке, так как эта строка уже обработана.Это возможно, но синтаксис sed
быстро становится беспорядочным.
Чтобы быть более конкретным:
В операции по умолчанию sed циклически добавляет строкуввод, за исключением его завершающего символа , в пространство шаблона .Чтение из входных данных должно быть пропущено, если было в пространстве шаблона до команды D
, заканчивающей предыдущий цикл.Затем утилита sed последовательно применяет все команды, адреса которых выбирают это пространство шаблона, до тех пор, пока команда не начнет следующий цикл или не завершит работу.Если ни одна команда явно не начала новый цикл, то в конце скрипта пространство шаблона должно быть скопировано в стандартный вывод (кроме случаев, когда указано -n
) , и пространство шаблона должно быть удалено.Всякий раз, когда пространство шаблона записывается в стандартный выходной файл или именованный файл, sed сразу же следует за ним с .
Короче говоря, если вы не манипулируете пространством шаблона , вы не можете обрабатывать символов, так как они просто не появляются!
И даже короче, если вы используете только команду замены, sed обрабатывает только одну строку за раз!
ThisТакже вы страдаете от : unterminated substitute pattern
.Вы ищете символ новой строки, но поскольку sed просто читает по одной строке за раз, он просто не находит его и также не ожидает его.Ошибка исчезнет, если вы замените символ новой строки символами \n
.
sed -i '' s/'assets\"\n #'/'some new text'/ filename.txt
. Лучшим способом достижения ваших целей будет использование awk
.Это немного более читабельно:
awk '/# [[NEW_APP_ADD_ASSETS]]/{ print t","; t="line1\nline2"; next }
{ print t; t=$0 }
END{ print t }' <file>