Найдите и замените в большом файле

Я хочу найти часть текста в большом XML-файле и хотеть заменить некоторым другим текстом. Размер файла составляет приблизительно (50 ГБ). Я хочу сделать это в командной строке. Я смотрю на Powershell и хочу знать, может ли он обработать большой размер. Также я хотел бы к знанию синтаксиса для выхода из ключевых операторов в powershell. Я - новичок PowerShell

В настоящее время я пробую что-то вроде этого, но этому не нравится он

    Get-Content C:\File1.xml | Foreach-Object {$_ -replace "xmlns:xsi=\"http:\/\/www\.w3\.org\/2001\/XMLSchema-instance\"", ""} | Set-Content C:\File1.xml

Текст, который я хочу заменить, является xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" с пустой строкой "".

Вопросы

  1. Может powerShell обрабатывать большие файлы
  2. Как я называю powershell сценарий из командной строки
  3. Синтаксис для выхода из ключевых операторов в powerShell и списке ключевых операторов в powerShell.
  4. Я не хочу, чтобы замена произошла в памяти и предпочла передавать потоком принятие, которое не принесет сервер к его коленям.
  5. Есть ли какие-либо другие подходы, которые я могу проявить (Различные инструменты / стратегия?)

Спасибо

6
задан Raj73 6 May 2010 в 19:27
поделиться

2 ответа

Это не нравится, потому что вы не можете читать из файла и записывать в него одновременно с помощью Get-Content / Set-Content. Я рекомендую использовать временный файл, а затем в конце переименовать file1.xml в file1.xml.bak и переименовать временный файл в file1.xml.

  1. Да, если вы не пытаетесь загрузить файл целиком. Построчно будет работать, но это будет немного медленнее. Используйте параметр -ReadCount и установите для него значение 1000, чтобы повысить производительность.
  2. Какая командная строка? PowerShell? В таком случае вы можете вызвать свой скрипт так . \ Myscript.ps1 , и если он принимает параметры, то c: \ users \ joe \ myscript.ps1 c: \ temp \ file1.xml .
  3. Обычно для регулярных выражений я бы использовал одинарные кавычки, если вам не нужно ссылаться на переменные PowerShell. Тогда вам нужно беспокоиться только об экранировании регулярных выражений, а не об экранировании PowerShell. Если вам нужно использовать двойные кавычки, то символ обратной галочки - это escape-символ в двойных кавычках, например. "` $ p1 установлен на $ ps1 ". В вашем примере одинарное цитирование упрощает ваше регулярное выражение (примечание: косые черты не являются метасимволами в регулярном выражении):

    'xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"'

  4. Абсолютно вы хотите транслировать это, поскольку 50 ГБ не поместятся в памяти. Однако это создает проблему, если вы обрабатываете построчно. Что делать, если текст, который вы хотите заменить, разделен на несколько строк?

  5. Если у вас нет проблемы с разделением строк, я думаю, PowerShell справится с этим.
4
ответ дан 8 December 2019 в 17:19
поделиться

Управляющий символ в строках PowerShell - это обратная кавычка (`), а не обратная косая черта (\). Я бы привел пример, но обратная кавычка также используется в вики-разметке. : (

Единственное, что вам следует избегать, это кавычки - точки и тому подобное должно быть нормально без.

-1
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: