2015-08-28 7 views
0

У меня есть следующий патч в команду:Заменить только первое вхождение строки в файле с использованием СЭД

sed 's'~"-log -asofdate $newAsOfDate "'~'"-log1"'~1' /export/home/ownclp/temp/runjava.sh.bk > $runjavaPath 

, но вместо того, чтобы заменить только первое вхождение его заменяющий все вхождения. Примечание: ~ - мой разделитель.

Как это решить?

+2

Вы имеете в виду, что оно заменяет значение более одного раза на заданную строку или на несколько строк в файле? Также цитирование этой команды является ужасным (и излишне сложным). –

+0

он заменяет значение несколько раз на линии. Извините за цитирование. Я новичок в Unix, все еще не очень удобно с синтаксисом –

+0

Какая версия sed это? –

ответ

1

Предполагая, что вы имеете в виду вы хотите заменить только первый экземпляр шаблона на первой линии, где кажется, что Вы хотите что-то вроде этого:

sed "0,/-log -asofdate $newAsOfDate /s~-log -asofdate $newAsOfDate ~-log1~" /export/home/ownclp/temp/runjava.sh.bk > "$runjavaPath" 

Как $newAsOfDate кажется, есть / в ней вам нужно будет использовать альтернативный адрес регулярок маркер, как это вместо:

sed "0,\~-log -asofdate $newAsOfDate ~s~-log -asofdate $newAsOfDate ~-log1~" /export/home/ownclp/temp/runjava.sh.bk > "$runjavaPath" 
+0

Используя ваше решение, я дал команду Unrecognized: 0,/- log -asofdate 01/08/2015/s ~ -log -asofdate 01/08/2015 ~ -log1 ~ ошибка. –

+0

Это из-за косых черт в шаблоне. Обновление. –

+0

, используя обновленную версию, в файле нет никаких изменений. есть ли альтернативный способ сделать это, проще, возможно, используя awk? –

0

Это может работать для вас (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 также оставляет любые выдающиеся команды после печати последней строки.

+0

Я использую Solaris sed, поэтому это определенно не сработало –

+0

@ArchitSharma Я не знаком с Solaris (и к какой версии sed он использует), но обычно я нашел, разделив приведенную выше команду на отдельные команды и используя '-e' вы можете достичь своей цели. См. Править. – potong

+0

Не могли бы вы объяснить свой ответ? то я могу попробовать преобразовать его в формат solaris –

Смежные вопросы