Windows Bat Найти и заменить разрывы строк в Specifi c Lines - PullRequest
1 голос
/ 06 апреля 2020

Я не профессиональный разработчик и мне нужно простое решение. Я пытался использовать fart.exe в Windows Bat-файле для выполнения sh, но не смог найти точные строки, которые мне нужны, чтобы заменить разрывы строк. Вот что я пытаюсь сделать в файле XML.

Мне нужно go из этого (несколько строк в середине большего файла):

<meta name="xyz:moreinfohere" content="some content"/>
            <meta name="abc:evenmoreinfo" content="more content
and here is where
the problem lies"/>
            <meta name="abc:infoagain" content="this is confusing"/>
            <meta name="xyz:blahblah" content="please help"/>

to this:

            <meta name="xyz:moreinfohere" content="some content"/>
            <meta name="abc:evenmoreinfo" content="more content&#xa;and here is where&#xa;the problem lies"/>
            <meta name="abc:infoagain" content="this is confusing"/>
            <meta name="xyz:blahblah" content="please help"/>

Данные, заполненные в этих полях, будут переменными, и это вымышленный пример. По сути, я пытаюсь заменить разрывы строк кодом XA, но только некоторые строки, как вы можете видеть. Мне удалось использовать fart.exe для замены всех экземпляров \ n \ r, но я не могу понять, как сделать только необходимые. Не каждая строка начинается с «мета ...». Однако каждая строка в файлах должна заканчиваться символом «>» ... это единственный постоянный / фиксированный символ в каждой строке в файлах. Пожалуйста помоги! Я открываю все, что работает в стандартном Windows файле Bat (пердеть, java, et c.)

1 Ответ

0 голосов
/ 06 апреля 2020

Как вы узнали, совместимый со стандартом синтаксический анализатор XML заменит перевод строки в значении атрибута пробелом, если перевод строки не закодирован с использованием символьной ссылки (например, &#xA;). ( Ссылка )

Поэтому, хотя я обычно рекомендую использовать правильный анализатор XML, это не сработает, потому что мы пытаемся исправить поврежденный XML (то есть * 1036). * это означает что-то отличное от того, что мы хотим, чтобы оно означало).

Мы могли бы написать правильный синтаксический анализатор XML, который просто не выполняет перевод строки в замену пространства, и использовать его для исправления файла, но это много работы. Вероятно, достаточно следующего:

Допущения:

  • Все значения атрибутов, которые необходимо исправить, используют двойные кавычки (не одиночные кавычки).
  • Двойные кавычки всегда встречается парами в документах, которые необходимо исправить.

fix.pl:

use strict;
use warnings;

local $/;
while (<>) {
   while (1) {
      /\G ( [^"]+ ) /xgc
         and print $1;

      /\G \z /xgc
         and last;

      /\G ( " [^"]* " ) /xgc
         and do {
            print $1 =~ s/\n/&#xA;/rg;
            next;
         };

      die("Unbalanced quotes");
   }
}

Использование:

perl fix.pl file_to_fix.xml >fixed_file.xml

или

perl -i.bak fix.pl file_to_fix.xml

Последний изменяет файл на месте после создания резервной копии.

После использования этого инструмента используйте инструмент сравнения файлов (например, Beyond Compare ), чтобы убедиться в исправлении. был правильно применен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...