代码之家  ›  专栏  ›  技术社区  ›  Yarin

sed命令和-i选项在Mac上失败,但在Linux上有效

  •  243
  • Yarin  · 技术社区  · 14 年前

    我已经成功地使用了 sed 在Linux中搜索/替换文本的命令:

    sed -i 's/old_link/new_link/g' *
    

    然而,当我在我的MacOSX上尝试时,我得到:

    “命令c需要\后跟文本”

    我以为我的Mac机运行的是普通的BASH shell。怎么了?

    编辑:

    根据@High Performance的说法,这是由于Mac 塞德 具有不同的(BSD)风格,因此我的问题是如何在BSD中复制此命令 塞德 ?

    编辑:

    下面是一个实际的例子:

    sed -i 's/hello/gbye/g' *
    
    11 回复  |  直到 9 年前
        1
  •  359
  •   Benjamin W.    6 年前

    如果你使用 -i 选项需要为备份提供扩展。

    如果你有:

    File1.txt
    File2.cfg
    

    命令(注意 -我 '' 以及 -e 要使其在新版本的Mac和GNU上工作,请执行以下操作:

    sed -i'.original' -e 's/old_link/new_link/g' *
    

    创建两个备份文件,如:

    File1.txt.original
    File2.cfg.original
    

    没有可移植的方法可以避免生成备份文件,因为无法找到在所有情况下都能工作的sed命令的组合:

    • sed -i -e ... -不能在OSX上运行 -e类 备份
    • sed -i'' -e ... -不适用于OS X 10.6,但适用于10.9+
    • sed -i '' -e ... -不在GNU上工作

    注意 考虑到并非所有平台上都有sed命令,您可以尝试使用另一个命令来获得相同的结果。

    例如。, perl -i -pe's/old_link/new_link/g' *

        2
  •  58
  •   Dennis Williamson    14 年前

    我相信在OS X上使用-I备份文件的扩展名是 必修的 . 尝试:

    sed -i .bak 's/hello/gbye/g' *
    

    使用GNU sed 分机是 可选择的 .

        3
  •  53
  •   Giacomo1968 Arvind    9 年前

    这适用于GNU和BSD版本的sed:

    sed -i'' -e 's/old_link/new_link/g' *
    

    或备份:

    sed -i'.bak' -e 's/old_link/new_link/g' *
    

    注意后面缺少空格 -i 选择!(GNU sed所必需)

        4
  •  31
  •   gniourf_gniourf    8 年前

    在Mac上也有同样的问题 brew :

    brew install gnu-sed
    

    并用作

    gsed SED_COMMAND
    

    你也可以设置好 sed 作为别名 gsed (如果需要):

    alias sed=gsed
    
        5
  •  20
  •   Ohad Kravchick    13 年前

    或者,可以在Mac中安装GNU版本的sed,称为gsed,并使用标准的Linux语法。

    为此,请安装 gsed 使用端口(如果没有,请访问 http://www.macports.org/ )通过跑步 sudo port install gsed . 然后,你可以跑 sed -i 's/old_link/new_link/g' *

        6
  •  8
  •   High Performance Mark    14 年前

    您的Mac确实运行了BASH shell,但这更多的是一个问题,您要处理的是sed的哪个实现。在Mac上,sed来自BSD,与典型的Linux机器上的sed有细微的不同。我建议你 man sed .

        7
  •  8
  •   Lucas    12 年前

    辛特里斯的回答是对的,但我用这个 find 命令以更具体地说明要更改的文件。一般来说,这应该有效(在osx上测试 /bin/bash ):

    find . -name "*.smth" -exec sed -i '' 's/text1/text2/g' {} \;
    

    一般使用时 sed 没有 找到 在复杂的项目中效率较低。

        8
  •  2
  •   v.babak    6 年前

    我已经创建了一个函数来处理 sed MacOS(在MacOS 10.12上测试)与其他操作系统的区别:

    OS=`uname`
    # $(replace_in_file pattern file)
    function replace_in_file() {
        if [ "$OS" = 'Darwin' ]; then
            # for MacOS
            sed -i '' -e "$1" "$2"
        else
            # for Linux and Windows
            sed -i'' -e "$1" "$2"
        fi
    }
    

    用法:

    $(replace_in_file 's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"',' "./mysql/.env")
    

    哪里:

    , 是分度计

    's,MASTER_HOST.*,MASTER_HOST='"$MASTER_IP"',' 是模式

    "./mysql/.env" 是文件的路径

        9
  •  1
  •   katopz    8 年前

    下面是如何将环境变量应用于模板文件(不需要备份)。

    一。用{{FOO}创建模板,以便以后替换。

    echo "Hello {{FOO}}" > foo.conf.tmpl
    

    2。用FOO变量替换{FOO},并输出到新的FOO.conf文件

    FOO="world" && sed -e "s/{{FOO}}/$FOO/g" foo.conf.tmpl > foo.conf
    

    同时工作 macOS 10.12.4版 Ubuntu 14.04.5版

        10
  •  0
  •   Dan Kohn    8 年前

    正如其他答案所表明的,没有一种方法可以在不制作备份文件的情况下跨OS X和Linux可移植地使用sed。所以,我用了这个Ruby one行:

    ruby -pi -e "sub(/ $/, '')" ./config/locales/*.yml
    

    在我的情况下,我需要从 rake 任务(即,在Ruby脚本中),所以我使用了这个额外的引用级别:

    sh %q{ruby -pi -e "sub(/ $/, '')" ./config/locales/*.yml}
    
        11
  •  -1
  •   Thomas user3246149    9 年前
    sed -ie 's/old_link/new_link/g' *
    

    适用于BSD和Linux