Это может работать для вас (GNU СЭД):
sed '\~-log -asofdate '"$newAsOfDate"' ~{s//-log1/;:a;n;ba}' oldFile >newFile
Это заменяет нужную строку для первого совпадения, а затем читает и печатает оставшуюся часть файла.
Эта альтернатива может работать для вас:
sed -e '\~-log -asofdate '"$newAsOfDate"' ~!b' -e 's//-log1/' -e ':a' -e 'n' -e 'ba' oldFile >newFile
Первая команда матч по любому адресу, который содержит требуемую строку. Альтернативный разделитель ~
используется, если переменная оболочки "$newAsOfDate"
содержит разделитель по умолчанию /
. Если совпадение не выполнено (следовательно, !b
), строка печатается как обычно, команда b
означает разрыв с последовательностью следующих команд и, как нет места, после b
печать текущей команды начинается с первой команды. Второй оператор -e
означает следующее соответствие, замените соответствующую часть предыдущего адреса и замените его на -log1
. Следующие три оператора задают механизм цикла. Первый - это пространство имен или место для размещения петли :a
, вторая команда n
означает печать текущей строки, а затем замену пространства рисунка на следующую строку, и, наконец, команда ba
означает возврат к держателю места цикла :a
. Команда n
также оставляет любые выдающиеся команды после печати последней строки.
Вы имеете в виду, что оно заменяет значение более одного раза на заданную строку или на несколько строк в файле? Также цитирование этой команды является ужасным (и излишне сложным). –
он заменяет значение несколько раз на линии. Извините за цитирование. Я новичок в Unix, все еще не очень удобно с синтаксисом –
Какая версия sed это? –