gpt4 book ai didi

bash - Perl 在一个大文本文件中进行多项搜索和替换操作

转载 作者:行者123 更新时间:2023-11-29 09:25:13 25 4
gpt4 key购买 nike

给定文件中的一组替换字符串 replacements.txt喜欢

s/string1/replacement1/g;
s/string2/replacement2/g;
s/string3/replacement3/g;
s/string4/replacement4/g;
s/string5/replacement5/g;

我想获得相当于

sed -f replacements.txt infile.txt 

我的文件太大了 sed无法处理它,虽然我知道 perl 可以做到这一点。

而且替换的真的很多,而且时不时的变化。 (我需要运行这个十几次)

请注意,替换项是固定字符串,因此我真的不需要将它们作为正则表达式。

sed只有在 regexp 时才会出现问题有 glob,输入文件是一个大行。

最佳答案

perl相当于你的 sed命令是:

perl -p replacements.txt infile.txt

它应该适用于您的示例 replacements.txt ,鉴于 s语句正确; -terminated(注意 sed 会将行尾本身识别为语句终止符)。


然而,真正的问题是整个大文件是单行,因此避免内存不足的关键是:

  • 暂时将该行分成许多短行,
  • 通过管道发送这些短行并对它们执行字符串替换,
  • 然后将修改后的短线重新拼接成一条线。

如果数据中有一个字符分隔记录(数据单元),在不干扰字符串替换的情况下,将长行分成多个tr的帮助 是一种可行的方法;我将使用 }举个例子,因为 Kuzeko 声明数据是 JSON-like:

如果你有 GNU sed (Linux;用 sed --version 验证):

tr '}' '\0' < infile.txt | sed -z -f replacements.txt | tr '\0' '}'

拥有tr输出 NUL -分隔的“行”(\0)和sed相应地阅读它们 ( -z ) 是处理分块的最可靠方法。
不幸的是,-z/--null-data选项不符合 POSIX,BSD/macOS 实现支持它。

否则(例如,在 ma​​cOS 上):

tr '}' '\n' < infile.txt | perl -p replacements.txt infile.txt | tr '\n' '}'

警告:如果 infile.txt 中的单行有尾随 \n ,你最终会得到一个额外的 }字符。在最后;为了防止这种情况,添加一个初始 tr阶段到删除 \n 的管道:
tr -d '\n' < infile.txt | tr '}' '\n' | ...

perl仍然需要,因为 - 不像 BSD/macOS sed - 它保留尾随- \n - 或 - 不是输入最后一行的状态。

关于bash - Perl 在一个大文本文件中进行多项搜索和替换操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44907434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com