Sed с несколькими строками не заменяет шаблон - PullRequest
2 голосов
/ 11 марта 2011

Я выполняю массаж с помощью sed (см. Учебник здесь: Grymoire ) ASCII-файлы, которые мы получаем от наших поставщиков оборудования.Файлы имеют такую ​​структуру, как

Model-Manufacturer:D12-500
Test_Version:2.6.3

Но некоторые файлы, которые мы получаем, случайным образом «ломаются» и пропускают запись для «Модель-Производитель»:

Model-Manufacturer:D12-500
Test_Version:2.6.3
Model-Manufacturer:H24-700
Test_Version:2.6.3
Test_Version:2.6.3
Model-Manufacturer:R15-300
Test_Version:2.6.3

Я хочу это исправитьпроблема с Sed и поместите отсутствующую запись для «Модель-Производитель: N / A» до второго появления «Test_Version: 2.6.3»;это мой код

sed -n '
/Test_Version/ {
# found "Test_Version" - read in next line
        N
# look for "Test_Version" on the second line
# and print if there.
        /\n.*Test_Version/ {
# found it - now edit making one line
                s/Test_Version/Model-Manufacturer:N/A/
        }
}' infile > outfile

Это не работает.Я считаю, что мне нужно помнить положение каждого "Test_Version" и "Model_Manufacturer" перед выполнением замены, правильно?Могу ли я сделать это с помощью sed?

Заранее спасибо за ваш вклад.

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Измените вашу замену на:

s||\nModel-Manufacturer:N/A&|

Использование альтернативного разделителя означает, что вам не нужно избегать косой черты в «N / A». Использование пустой левой стороны повторно использует самый последний матч. Амперсанд копирует спичку в правую сторону.

Также необходимо удалить -n.

1 голос
/ 11 марта 2011

Если я понимаю, чего вы пытаетесь достичь, вы очень близки.Я думаю, что изменение команды подстановки на следующее заставляет ее работать:

s/\nTest_Version/\nMode-Manufacturer:N\/A\nTest_Version/
...