我曾多次遇到需要对文本文档执行数百次查找/替换的情况。这些查找/替换不遵循正则表达式可以合理应用的模式,需要按顺序应用。以前,我经过大量搜索后才手动执行这些操作,但有没有更好的方法?
答案1
如果我误解了您的问题,请纠正我,但从您的描述来看,我认为您有一个(可能非常大的)Ascii.txt
文档,并且当您说必须“按顺序”应用更改时,您的意思是您想对整个文档进行第一次搜索/替换,然后对整个文档进行第二次搜索/替换,依此类推。
也许最简单的解决方案是创建一个包含脚本的文件(称为sedscript
)sed
,每行更改一次。下面是一个例子。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
。
下面是一个截图,展示了其工作原理。
答案2
通常程序擅长将单个搜索和替换组合应用于多个文件,而不是相反。
在我看来,最好的办法是使用具有宏功能的文字处理器程序。然后,您可以编写一个执行替换的函数,然后使用搜索/替换字符串调用它数百次。例如,启用宏的文字处理器包括 LibreOffice Writer 和 Microsoft Word。
答案3
屁应该能够帮助您。只需创建一个包含多个 FART 调用的批处理文件,如果您想要替换换行符 ( ),请通过或参数\r\n
启用 C 样式语法。-C
--c-style