
У меня есть текстовый файл, похожий на пример ниже.
Я хочу вставить
<string>insert-me</string>
на указанной линии.
Как это сделать? Я пробовал варианты, похожие на этот:
sed "/s/<key>first</key>/\n <array>/\n/test/g" test.txt
и я продолжаю получать ошибку «неверный флаг в команде замены».
Спасибо
пример текстового файла:
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>
решение1
Здесь есть несколько проблем (помимо общей проблемы анализа структурированных данных с помощью инструментов регулярных выражений)
если ваш шаблон (или замена) содержит слеши, то вам нужно либо использовать другой разделитель для команд sed, либо экранировать слеши
sed (обычно) ориентирован на строки, поэтому вы не сможете выполнить сопоставление за пределами строк, если только не добавите дополнительные строки в пространство шаблона с помощью
N
сопоставление определенного количества пробелов сделает все это еще более хрупким
Например, вы можете сделать следующее:
sed '/<key>second<\/key>/ {N; s/\n[[:blank:]]*<array>/&\n\tinsert-me/;}' test.txt
или (что более естественно) используяаприложить, а несзаменитель
sed -e '/<key>second<\/key>/ {N; /<array>/ a\\tinsert-me' -e ';}' test.txt
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
insert-me
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>