Java java.util.regex.Matcher replaceFirst(...)/ replaceAll(...)API返回字符串,如果使用默认堆大小,则可能导致OOME输入大小为20-50M字符.这2种方法可以容易地重写为写至Writer做得相当比构建叮咬,有效地消除了一个故障点.
该Matcher的工厂方法,但是只接受CharSequences,这也有可能,如果我使用抛出一个OOME StringS/StringBufferS/StringBuilder秒.
如何包装a java.io.Reader来实现一个CharSequence接口(假设我的regexp可能包含反向引用)?是否有任何其他解决方案可以替换文件中的正则表达式而不是大型输入上的OOME?
换句话说,我如何sed在Java中实现类似于GNU的功能(sed众所周知,处理大到几TB的文件,同时支持扩展的正则表达式)?
由于您实际上需要的是sed您可以通过执行以下操作来执行它的行为:
String[] cmdArray = {"bash", "-c", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray);
Run Code Online (Sandbox Code Playgroud)
我放置了一个 bash 示例,但如果您想在 Windows 上运行它,您可以sed通过 Cygwin 安装命令并执行相同的命令,或者只安装适用于 Windows 的 sed 命令,您可以从此处下载:
http://gnuwin32.sourceforge.net/packages/sed.htm
对于 Windows,您可以使用:
String[] cmdArray = {"call", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray);
Run Code Online (Sandbox Code Playgroud)
我没有 Windows,因此无法测试上述命令,您可能必须删除call或更改call为sed. 您可以尝试的另一种选择是:
String[] cmdArray = {"cmd", "/c", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray);
Run Code Online (Sandbox Code Playgroud)
在此链接中,您可以找到一个dir从 java 执行的示例,您可以对其进行调整以使用 sed。