Java Windows Bat查找和替换特定行中的换行符

Java Windows Bat查找和替换特定行中的换行符,java,windows,perl,batch-file,fart,Java,Windows,Perl,Batch File,Fart,我不是一个专业开发人员,需要一个简单的解决方案。我曾尝试在Windows Bat文件中使用fart.exe来完成此操作,但在找到替换换行符所需的确切行时遇到困难。在XML文件中,下面是我尝试做的事情 我需要从这里(在大文件中间的几行): 为此: <meta name="xyz:moreinfohere" content="some content"/> <meta name="abc:evenmoreinfo" content

我不是一个专业开发人员,需要一个简单的解决方案。我曾尝试在Windows Bat文件中使用fart.exe来完成此操作,但在找到替换换行符所需的确切行时遇到困难。在XML文件中,下面是我尝试做的事情

我需要从这里(在大文件中间的几行):


为此:

            <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实例,但我不知道如何只执行所需的实例。不是每一行都以“meta…”开头。但是,文件中的每一行都应该以“>”结尾……这是文件中每一行上唯一的常量/固定字符。请帮忙!我对任何在标准Windows Bat文件(fart、java等)中工作的东西都持开放态度。

正如您所发现的,符合标准的XML解析器将用空格替换属性值中的换行符,除非换行符是使用字符引用编码的(例如
)。()

因此,虽然我通常会建议使用适当的XML解析器,但这在这里不起作用,因为我们正在尝试修复损坏的XML(即,XML的含义与我们希望它的含义不同)

我们可以编写一个适当的XML解析器,它不执行换行到空间的替换,并使用它来修复文件,但这需要大量的工作。以下内容可能就足够了

假设:

  • 所有需要修复的属性值都使用双引号(而不是单引号)
  • 在要修复的文档中,双引号总是成对出现
fix.pl

使用严格;
使用警告;
本地$/;
而(){
而(1){
/\G([^”]+)/xgc
并打印$1;
/\G\z/xgc
最后,;
/\G(“[^”]*”)/xgc
做{
打印$1=~s/\n/&xA;/rg;
下一个
};
死亡(“不平衡报价”);
}
}
用法:

perl fix.pl file_to_fix.xml >fixed_file.xml

后者在备份后就地修改文件


使用此工具后,请使用文件比较工具(例如)确保正确应用了修复程序。

如您所知,符合标准的XML解析器将用空格替换属性值中的换行符,除非换行符使用字符引用(例如
和#xA;
)进行编码。()

因此,虽然我通常会建议使用适当的XML解析器,但这在这里不起作用,因为我们正在尝试修复损坏的XML(即,XML的含义与我们希望它的含义不同)

我们可以编写一个适当的XML解析器,它不执行换行到空间的替换,并使用它来修复文件,但这需要大量的工作。以下内容可能就足够了

假设:

  • 所有需要修复的属性值都使用双引号(而不是单引号)
  • 在要修复的文档中,双引号总是成对出现
fix.pl

使用严格;
使用警告;
本地$/;
而(){
而(1){
/\G([^”]+)/xgc
并打印$1;
/\G\z/xgc
最后,;
/\G(“[^”]*”)/xgc
做{
打印$1=~s/\n/&xA;/rg;
下一个
};
死亡(“不平衡报价”);
}
}
用法:

perl fix.pl file_to_fix.xml >fixed_file.xml

后者在备份后就地修改文件


使用此工具后,请使用文件比较工具(例如)确保已正确应用修复程序。

然后使用
powershell.exe
!它不仅可以使用常规经验或标准字符串进行搜索和替换,还内置了对
xml
的支持。@Compo,标准的xml parer在这里不起作用。兼容的解析器必须用空格替换换行符,这就是OP希望将换行符更改为

。这将导致解析器返回换行。@ikegami这工作得很好!非常感谢。一个小问题:结果将代码添加为

。即使我在fix.pl中更改了第15行,我似乎也无法更改它。我需要
和#xa

。我如何更新它?这三个字符的引用都是等效的。但从字面上来说,替换

与代码中的另一个(如果您希望这样做的话)一起修改pl文件的副本。再次感谢你,伙计!工作完美使用
powershell.exe
然后!它不仅可以使用常规经验或标准字符串进行搜索和替换,还内置了对
xml
的支持。@Compo,标准的xml parer在这里不起作用。兼容的解析器必须用空格替换换行符,这就是OP希望将换行符更改为

。这将导致解析器返回换行。@ikegami这工作得很好!非常感谢。一个小问题:结果将代码添加为

。即使我在fix.pl中更改了第15行,我似乎也无法更改它。我需要
和#xa

。我如何更新它?这三个字符的引用都是等效的。但从字面上来说,替换

与代码中的另一个(如果您希望这样做的话)一起修改pl文件的副本。再次感谢你,伙计!完美地工作
perl -i.bak fix.pl file_to_fix.xml