alibek Posted June 16, 2016 Сломался скрипт, который забирает выгрузки с сервера РКН. Видимо размер файла вырос и теперь парсер SAX не справляется. Есть XML-файл, в котором есть нода registerZipArchive большого объема. Я хочу ее содержание вынести в отдельный файл, а в исходном файле оставить пустую ноду. Вырезать видимо нужно с помощью sed. Не подскажите, как именно это сделать? Нужно сделать так, что если в тексте есть <registerZipArchive>data...</registerZipArchive>, то сохранить "data..." в отдельный файл, а в исходном файле его вырезать (чтобы получилось <registerZipArchive></registerZipArchive>). Использую такой запрос: sed -e 's|<registerZipArchive>.+</registerZipArchive>|<registerZipArchive></registerZipArchive>|' response.xml Но видимо что-то тут не то, потому что эта команда выводит полное содержание XML-файла, не вырезая из него архив в base64. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted June 16, 2016 Вопрос решился, оказалось что sed не понимает +. Заменил на *. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted June 16, 2016 С вырезанием из исходного запроса все получилось: sed 's|<registerZipArchive>.*</registerZipArchive>|<registerZipArchive>...cut...</registerZipArchive>|g' data.xml > data.xml А как бы мне перед этим получить вырезанную часть в отдельный файл? sed 's|<registerZipArchive>(.*)</registerZipArchive>|$1|g' data.xml > base64 не работает, sed не понимает $1 (да и скобки тоже). В нем вроде бы есть метки, но я не понял, как их использовать. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
myth Posted June 16, 2016 А почему бы не использовать xmlstarlet? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted June 16, 2016 Потому что он выдает ошибку "huge text node: out of memory". Вообщем сделал так: -n 's|.*<registerZipArchive>\(.*\)</registerZipArchive>.*|\1|p' Работает, хотя я и не очень понимаю, почему скобки нужно экранировать. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
myth Posted June 16, 2016 У меня все работает... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted June 16, 2016 У меня тоже до недавнего времени работало, а потом перестало. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ixi Posted June 17, 2016 Работает, хотя я и не очень понимаю, почему скобки нужно экранировать. man regex и не забывать, что по умолчанию включены basic, а не extended Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...