0

我有很多包含文本的 .txt 文件。在文本中有一些符号,比如说“@”。它们出现在随机位置。我想用另外 2 个符号替换这些符号中的前 2 个。因此,如果我有“@@ ... @ ... @@”(其中 ... 是文本),我想将其变为:xx ... @ ... @@ (如果我想替换@由 x)。我只想替换前两个符号,但我只遇到过允许我一次替换所有内容或什么都不替换(以这样的规模)的选项。是否有任何程序或功能可以让我一次对大量文件执行此操作,换句话说,我不必手动为每个文件执行此操作?

4

1 回答 1

-1

您可以在Vim编辑器中执行此操作。首先,这是如何在一个文件中执行此操作。假设我们在缓冲区中有这个文件。

junk
@@@@
@@@@

@这是将文件中第一次出现的 替换为 的命令x。要执行两次,我们只需执行两次:

:0/@/s/@/x/

如果我们得到后执行它:

junk
x@@@
@@@@

然后如果我们再执行一次,我们会得到:

junk
xx@@
@@@@

解剖学:

  start search at 0 (before first line)
 | search for something
 || search for a line containing @
 |||  when you find @ perform a substitution command 
 ||| |  replace this
 ||| | |   with that (just once: the first occurrence in the line)
 ||| | |  |
 vvv v v  v
:0/@/s/@/x/
 ^

要在大量文件上运行此命令,我们可以使用脚本自动执行该命令,例如:

 # find all the .txt files here and in all subdirectories,
 # and execute the command "ex <file> < script" on them

 $ find . -name '*.txt' -exec ex {} < script \;

我们使用ex作为替代名称的命令vi以 ex 模式启动它,它接受ex标准输入上的命令。

script填充物包含以下内容:

0/@/s/@/x/
0/@/s/@/x/
x

即做两个这些替换,然后:x保存并退出。

vi 中使用的冒号不是必需的,因为冒号是vi用于输入命令的交互式命令模式中的ex命令。

于 2013-06-11T00:07:56.683 回答