在 .txt 文件夹中查找并替换(但仅限前 1-3 行)

在 .txt 文件夹中查找并替换(但仅限前 1-3 行)

我有一个包含 .txt 文件的文件夹。它们都如下所示:

Title: Title of blog post.
Tags: tag1,tag2,tag3

Text on the post. Just my thoughts. 

> A blockqoute

Written in *markdown.* Using <http://scriptogr.am/>

Nothing really scary.

假设我想更改标签1标签一出于某种原因。是否可以运行某种grep或者查找和替换在我的文件夹里这些 txt 上?

如果我可以仅执行查找和替换前 1-3 行,那就更好了,因为我可能会在博客文章正文中写下单词“tag1”,但不想在那里更改它。

我在 Windows 7 上。但可以访问 Kubuntu 机器(如果这有任何区别的话)。

答案1

最简单的方法是在 GNU/Linux 机器上使用sed(1)。假设只有您要转换的文本文件位于以下目录中:

$ for a in /path/to/directory/*txt; do sed -i '1,3{s/tag1/tagOne/g;}' "${a}"; done

更详细地解释一下它的作用:

  • 有一个循环可以迭代您要使用的文件:

    for a in [...]; do [...]; done
    
  • 对于每次迭代,变量a将保存与通配模式匹配的文件的名称/path/to/directory/*txt

  • 一旦我们知道了正在处理的文件,我们就可以do对其进行一些处理,在本例中,我们使用一个sed命令:

    sed -i '1,3{s/tag1/tagOne/g;}'
    
  • 标志-i表示in place,因此sed命令不需要写入临时文件。接下来,1,3定义命令将操作的行范围sed。花括号是分组运算符,表示“从第 1 行到第 3 行,执行内部命令”。该命令是s:replace。replace 命令接受要匹配的正则表达式以及要替换该匹配的字符串,在本例中,您要用 替换tag1tagOne该命令以g修饰符结尾,表示global

用简单的英语来说,整个命令如下:

对于指定目录中每个以 txt 结尾的文件,将其中所有出现的 tag1 替换为 tagOne,但仅限于第一至三行。

答案2

你可以在 Ex 模式下使用 Vim:

for k in *.txt
do
  ex -sc '1s/tag1/tagOne/3|x' "$k"
done
  1. 1移至第一行

  2. 3选择 3 行

  3. s代替

  4. x保存并关闭

答案3

这可以在 notepad++ 中完成,只需点击

ctrl+shift+F

命令称为在文件中查找。

它没有实现“前三行”。解决方法可能是将我的标签命名为 @tag1 或 #tag1 或 &tag1。

相关内容