任何人都知道一种基于非行的工具以某种内存高效的方式“二进制”搜索/替换字符串?也看到这个问题。
我有一个 +2GB 的文本文件,我想对其进行处理,类似于以下内容:
sed -e 's/>\n/>/g'
Run Code Online (Sandbox Code Playgroud)
这意味着,我想删除在 a 之后出现的所有换行符>,而不是其他任何地方,因此排除tr -d.
这个命令(我从一个类似问题的答案中得到的)失败了couldn't re-allocate memory:
sed --unbuffered ':a;N;$!ba;s/>\n/>/g'
Run Code Online (Sandbox Code Playgroud)
那么,有没有其他不求助于C的方法呢?我讨厌 perl,但我愿意在这种情况下破例 :-)
我不确定数据中没有出现任何字符,所以\n如果可能的话,我想避免用另一个字符临时替换。
任何好主意,任何人?
我正在寻找一种方法来用具体的值替换模板文件中的占位符字符串,使用常见的 Unix 工具(bash、sed、awk,也许是 perl)。替换在单次通过中完成很重要,也就是说,已经扫描/替换的内容不得考虑用于另一次替换。例如,这两次尝试都失败了:
echo "AB" | awk '{gsub("A","B");gsub("B","A");print}'
>> AA
echo "AB" | sed 's/A/B/g;s/B/A/g'
>> AA
Run Code Online (Sandbox Code Playgroud)
在这种情况下,正确的结果当然是 BA。
一般来说,该解决方案应该等同于从左到右扫描输入以寻找与给定替换字符串之一的最长匹配,并且对于每个匹配,执行替换并从输入中的那个点继续(没有已经读取的输入也不应该考虑进行匹配的替换)。实际上,细节并不重要,只是替换的结果永远不会被完全或部分地考虑用于另一个替换。
注意我只是在寻找正确的通用解决方案。请不要提出对某些输入(输入文件、搜索和替换对)失败的解决方案,尽管它们看起来不太可能。