如何执行大量不同的查找/替换?

如何执行大量不同的查找/替换?

我曾多次遇到需要对文本文档执行数百次查找/替换的情况。这些查找/替换不遵循正则表达式可以合理应用的模式,需要按顺序应用。以前,我经过大量搜索后才手动执行这些操作,但有没有更好的方法?

答案1

如果我误解了您的问题,请纠正我,但从您的描述来看,我认为您有一个(可能非常大的)Ascii.txt文档,并且当您说必须“按顺序”应用更改时,您的意思是您想对整个文档进行第一次搜索/替换,然后对整个文档进行第二次搜索/替换,依此类推。

也许最简单的解决方案是创建一个包含脚本的文件(称为sedscriptsed,每行更改一次。下面是一个例子。g末尾的 表示“全局”,即替换所有出现的内容,而不仅仅是任何给定行中的第一个出现的内容。

s/foo/bar/g
s/hello/world/g
s/yellow/green/g
:

然后您可以按如下方式运行它:

sed -f sedscript infile.txt > outfile.txt

如果您对输出满意,只需mv将其返回到输入的顶部:

mv outfile.txt infile.txt

如果你使用的是 Linux 计算机,则附带sed。如果你使用的是 Windows,则可以使用以下任一方式获取sed(和mv赛格威或者我自己的汉密尔顿C壳(包括免费版本)。

添加:

因为您还想考虑跨越行尾的匹配,那么,是的,一种方法是用特殊字符或字符串替换所有行尾,执行您想要的搜索/替换操作,然后在完成后将行尾放回原处。

进行行尾转换的最简单方法sed是在单独的管道阶段中进行。在我这里的示例中,我将\r\n序列替换为,#但可以是完全任意的字符串(但如果您可以使用单个字符则更容易。)

sed 's/\r\n/#/' infile.txt | s -f sedscript | sed 's/#/\r\n/g' > outfile.txt

然后,您可以在文件中sedscript对两种变体进行搜索/替换,并在单词之间留一个空格,或者用其他内容进行替换。

如果你能够只使用一个字符,并且不需要多字符字符串来保证唯一性,则可以使用\(...\)符号来创建标记正则表达式围绕[...]可能分隔单词的字符列表。匹配的任何内容都可以作为 插入到替换字符串中\1

下面是一个截图,展示了其工作原理。

使用 sed 换行

答案2

通常程序擅长将单个搜索和替换组合应用于多个文件,而不是相反。

在我看来,最好的办法是使用具有宏功能的文字处理器程序。然后,您可以编写一个执行替换的函数,然后使用搜索/替换字符串调用它数百次。例如,启用宏的文字处理器包括 LibreOffice Writer 和 Microsoft Word。

答案3

应该能够帮助您。只需创建一个包含多个 FART 调用的批处理文件,如果您想要替换换行符 ( ),请通过或参数\r\n启用 C 样式语法。-C--c-style

相关内容