我有一个包含 .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 命令接受要匹配的正则表达式以及要替换该匹配的字符串,在本例中,您要用 替换tag1
。tagOne
该命令以g
修饰符结尾,表示global
。
用简单的英语来说,整个命令如下:
对于指定目录中每个以 txt 结尾的文件,将其中所有出现的 tag1 替换为 tagOne,但仅限于第一至三行。
答案2
你可以在 Ex 模式下使用 Vim:
for k in *.txt
do
ex -sc '1s/tag1/tagOne/3|x' "$k"
done
1
移至第一行3
选择 3 行s
代替x
保存并关闭
答案3
这可以在 notepad++ 中完成,只需点击
ctrl+shift+F
命令称为在文件中查找。
它没有实现“前三行”。解决方法可能是将我的标签命名为 @tag1 或 #tag1 或 &tag1。