有没有批量替换若干文件的同一内容的方法?

2010-08-14 00:16:58 +08:00
 lin
比如同一目录下的所有文件。

将文本A替换成文本B。

Mac下。
6349 次点击
所在节点    macOS
14 条回复
kailuo
2010-08-14 00:20:02 +08:00
Automator 做不了?
chuangbo
2010-08-14 00:23:34 +08:00
sed -i "s/xxx/xxxx/g" somedir/*
或者 awk 脚本
lin
2010-08-14 00:56:56 +08:00
@kailuo 我不懂Automator。我尝试了几个不同的录制流程。播放的时候都报错。

@chuangbo 可是我要替换的字里面包括了/的。这个时候应该怎么改?

准确来讲,我要做的替换包括:

<a href="/">V2EX</a>

换成

<a href="/">{{ site_name }}</a>
chuangbo
2010-08-14 01:01:22 +08:00
无关,那个/是sed参数之间的间隔
sed -i "s/V2EX/{{ site_name }}/g" somedir/*
lin
2010-08-14 01:06:36 +08:00
@chuangbo 可是有些地方我想保留“V2EX”。我只是要把部分硬链接(是不是叫这个名字?)变软。

我好奇。假如:

sed -i "s/<a href="/">V2EX</a>/<a href="/">{{ site_name }}</a>/g" tpl/*

它怎么知道我的引号和"/"该在什么时候闭合?需要用到(那叫什么来着?)转义符(是这个名字吗?)吗?

谢谢!
chuangbo
2010-08-14 01:06:48 +08:00
我都是这么替换的,如果一个文件夹内可能在任何层级的任何子目录的任何文件都有可能包含
somefile.v5.js 或者 somefile.v9.js
我需要全部换成 somefile.v19.js
那么
egrep "somefile\.v\d+\.js" -Ir * | xargs -I '{}' sed -i "s/somefile.v..js/somefile.v19.js/g"
其中,egrep负责递归找出包含有这行的文件,然后xargs对上一结果的每一行执行sed命令,sed命令负责替换
更复杂的话还是要写awk脚本了
chuangbo
2010-08-14 01:08:08 +08:00
最外层用单引号 :)
chuangbo
2010-08-14 01:09:01 +08:00
引号可以把最外层改为单引号解决
/可以用\/转义
ninjai
2010-08-14 01:10:47 +08:00
dreamweaver之类的富文本编辑器,支持正则表达式
chuangbo
2010-08-14 01:11:08 +08:00
sed 's/<a href="\/">V2EX<\/a>/<a href="\/">{{ site_name }}<\/a>/g' somedir/*
chuangbo
2010-08-14 01:13:36 +08:00
@ninjai 不知道 Mac OS X 下有没有dw了,不过Unix下很多小工具基于正则,简洁而不简单。
Livid
2010-08-14 01:14:09 +08:00
TextMate

CMD+SHIFT+F
lin
2010-08-14 01:23:41 +08:00
@Livid 这个太强了!

我本来就用TextMate来着。但是不知道这个方法。

我用了一个很冏的方法就是鼠标选侧栏的文件(未打开状态),然后执行CMD+F
结果当然是失败的。

现在好了。谢谢!

同谢其他热心回答的朋友。学习了。:)
Sai
2010-08-14 02:04:54 +08:00
@lin
其实Coda也可以
cmd+f 设置好 Find in "Folder" 以后 Find -> Relpace All

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1676

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX