V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lin
V2EX  ›  macOS

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

  •  
  •   lin · 2010-08-14 00:16:58 +08:00 · 6442 次点击
    这是一个创建于 5216 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如同一目录下的所有文件。

    将文本A替换成文本B。

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

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

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

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

    换成

    <a href="/">{{ site_name }}</a>
    chuangbo
        4
    chuangbo  
       2010-08-14 01:01:22 +08:00
    无关,那个/是sed参数之间的间隔
    sed -i "s/V2EX/{{ site_name }}/g" somedir/*
    lin
        5
    lin  
    OP
       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
        6
    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
        7
    chuangbo  
       2010-08-14 01:08:08 +08:00
    最外层用单引号 :)
    chuangbo
        8
    chuangbo  
       2010-08-14 01:09:01 +08:00
    引号可以把最外层改为单引号解决
    /可以用\/转义
    ninjai
        9
    ninjai  
       2010-08-14 01:10:47 +08:00
    dreamweaver之类的富文本编辑器,支持正则表达式
    chuangbo
        10
    chuangbo  
       2010-08-14 01:11:08 +08:00
    sed 's/<a href="\/">V2EX<\/a>/<a href="\/">{{ site_name }}<\/a>/g' somedir/*
    chuangbo
        11
    chuangbo  
       2010-08-14 01:13:36 +08:00
    @ninjai 不知道 Mac OS X 下有没有dw了,不过Unix下很多小工具基于正则,简洁而不简单。
    Livid
        12
    Livid  
    MOD
       2010-08-14 01:14:09 +08:00 via iPhone   ❤️ 1
    TextMate

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

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

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

    现在好了。谢谢!

    同谢其他热心回答的朋友。学习了。:)
    Sai
        14
    Sai  
       2010-08-14 02:04:54 +08:00   ❤️ 2
    @lin
    其实Coda也可以
    cmd+f 设置好 Find in "Folder" 以后 Find -> Relpace All
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 21:15 · PVG 05:15 · LAX 13:15 · JFK 16:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.