【问题标题】:SED on Mac OS XMac OS X 上的 SED
【发布时间】:2012-08-09 22:02:48
【问题描述】:

所以我尝试通过 macports 安装 gsed,但这并没有解决问题。我打算卸载它以减少混乱,但是,在我这样做之前,我将如何修复下面的错误。这是因为我所理解的 sed Mac OS X 的 BSD 版本正在运行,但我似乎找到的修复程序都没有帮助。

sed: 1: "/\[staging: production\ ...": command i expects \ followed by text

#!/bin/bash

test="lala\nkjdsh"
sed -i -e '/\[staging: production\]/ i '$test'' ./test.txt

【问题讨论】:

    标签: macos bash sed gnu bsd


    【解决方案1】:

    你有这个问题是因为$test 中的“\n”。尝试从中删除\n

    POSIX 标准 sed 仅接受 \n 作为搜索模式的一部分。 OS X 使用 FreeBSD sed,它严格符合 POSIX 标准

    因此,如果您需要在变量中添加换行符,则需要编写如下内容:

    $ test="lala\
    > kjdsh"
    

    你也可以用perl解决这个任务:

    $ test="lala\nkjdsh"
    $ perl -n -i -e 'print "'"$test"'\n" if /\[staging: production\]/; print;' ./test.txt
    

    例子:

    $ echo '[staging: production]' > /tmp/test.txt
    $ test="lala\nkjdsh"
    $ perl -n -i -e 'print "'"$test"'\n" if /\[staging: production\]/; print;' ./test.txt
    $ cat ./test.txt
    lala
    kjdsh
    [staging: production]
    

    【讨论】:

    • 我需要保留变量中的新行并将它们添加到脚本中
    • 我刚刚描述了当您想使用sed 添加换行符时需要执行的步骤。请检查一下。
    • $test 未加引号,因此展开后会被分词,如果 perl 脚本包含空格,则会将其分解为多个参数。
    • @geirha:你说的不对,你可以自己查,或者直接看我的例子(我刚刚加了)。但如果您认为test 中会有空格,您可以在其周围添加双引号。
    • @IgorChubin 试试test='foo bar\n"baz"'
    【解决方案2】:

    如果测试变量不包含仅包含. 的行,您可以使用ed 编辑文件:

    printf '%s\n' '/\[staging: production\]/i' "$test" . w | ed -s ./test.txt
    

    有关ed 的更多信息,请参阅http://wiki.bash-hackers.org/howto/edit-ed

    编辑:哦,我错过了你的变量中实际上有反斜杠后跟 N 而不是文字换行符。如果您使用文字换行符,上述应该可以工作。

    EDIT2:给定 cmets 中给出的 pastebin,尝试:

    #!/usr/bin/env bash
    #...
    ed -s ./test.txt << EOF
    /\[staging: production\]/i
    
    ; some comment
    someStuffHere[] = "XYZ"
    someMoreStuff[] = "$someShellVar"
    
    ; another comment
    .
    w
    EOF
    

    单独一行的.结束insert命令,w是写命令,实际上是保存对文件的更改,(就像vim中的:w

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-04
      • 2012-12-23
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多