vipermagi писал(а): ↑30.08.2009 11:53
Требуется однократно вставить дополнительную опцию после, или даже возможно перед, одной из существующих.
это вставляет ПОСЛЕ строки, ПЕРЕД - команда i, ВМЕСТО - c.
Команда s ищет совпадения и меняет их В ПРЕДЕЛАХ ОДНОЙ СТРОКИ.
vipermagi писал(а): ↑30.08.2009 11:53
Мой вариант
Код
Код: Выделить всё
sed -i '/option/,/^$/s/^$/вставляемый_текст/1' prog.conf
Эта строка работатет только в ДИАПАЗОНЕ, от /option/, до первло пустой строки включительно.
В этом диапазоне, она В КАЖДОЙ строке ищет пустую строку, и меняет её на "вставляемый_текст".
применение модификатора 1 - не имеет смысла - пустая строка может встретится только один раз в любой строке.
vipermagi писал(а): ↑30.08.2009 12:38
А на лету без создания промежуточных файлов можно? Хотя я не совсем понял что на что менять
можно вообще без файлов - уберите -i и имя, и набирайте в /dev/stdin, а читать - в /dev/stdout :)
allez писал(а): ↑30.08.2009 12:40
Как вариант могу предложить такой порядок действий:
1. Заменяем в тексте символы новой строки на какое-нибудь сочетание символов (например, "?:%"). Получаем файл, в котором весь текст находится в одной строке.
так делать НЕ следует - слишком много памяти пожрёт этот скрипт, и возможно завалит систему (во всяком случае сильно её затормозит).
хотя если вы УВЕРЕНЫ, что файлы мелкие (1-10000байт), то можно.
PS: кстати, можно и не заменять, а загрузить все строки текста в память командой N.
а потом ВСЕ строки сразу обработать. Но это хуже. Лучше и быстрее использовать адресные выражения.
Примеры можно посмотреть в info sed.