24

我正在尝试在 MacOSX 终端上运行此命令,该终端最初打算在 Linux 上运行

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' init.txt >> ~/.bash_profile

但它给了我错误:

command i expects \ followed by text. 

有什么办法可以修改上述命令以在 MacOSX 终端上工作

4

5 回答 5

36

避难所是对的,但还有另一种方法可以做到。在将$'...'字符串传递给sed.

所以:

         sed -iold '1i\'$'\n''text to prepend'$'\n' file.txt
                      ^^^^^^^^                     ^
                     / |\|||/ \                    |__ No need to reopen
                     | | \|/  |                          string to sed
     Tells sed to    | |  |   |
    escape the next _/ |  |   +-----------------------------+
         char          |  +-------------+                   |
                       |                |                   |
                  Close string   The  special bash   Reopen string to
                     to sed       newline char to      send to sed
                                    send to sed

unix.stackexchange.com 上的这个答案让我找到了这个解决方案。

于 2014-06-22T22:31:43.817 回答
18

有同样的问题并用brew解决了:

brew install gnu-sed

gsed YOUR_USUAL_SED_COMMAND

如果你想使用 sed 命令,那么你可以设置一个别名:

alias sed=gsed

于 2015-05-05T08:34:31.853 回答
6

OSXsed是基于旧版本的,你需要在 sed 的方向上更加直截了当,而且你很幸运,在这种情况下,sed它会准确地告诉你该做什么。未经测试,因为我没有 OSX,但请尝试

sed '1 i\
VISPATH=/mnt/local/gdrive/public/3DVis

' init.txt >> ~/.bash_profile

通过icmd 输入的内容以空行结束。之后可以遵循其他 sed 指令。注意,字符后没有\字符!

另外,@StephenNiedzielski 是对的。使用单引号字符来包装您的 sed 语句。(如果您需要在您的 sed 中进行变量扩展并且可以逃避 的其他用途$,那么您也可以使用 dbl-quotes,但不建议将其作为常规做法。

编辑

据我所知,您是从命令行执行此操作,而不是在脚本或其他编辑器中执行此操作,我已经测试了上述内容,并且....我只能说来自技术支持的那句著名的行... “这个对我有用”。如果您收到错误消息

sed: -e expression #1, char 8: extra characters after command

那么你几乎可以肯定在 . 之后添加了一些字符 \。我刚刚测试过,我收到了上面的错误信息。(我使用的是 sed 的 linux 版本,因此错误消息完全相同)。您应该编辑您的问题以包含命令行的精确剪切粘贴和的错误消息。使用卷曲单引号将不起作用。

IHTH

于 2013-02-13T04:23:33.110 回答
5

这是我在 OS X 上的解决方法。就我而言,我需要将文本添加到文件中。显然,现代 sed 是这样工作的:

sed -i '1i text to prepend' file.txt

但在 OS XI 上必须执行以下操作:

sed -i '' '1i\
text to prepend
' file.txt
于 2014-02-22T05:58:03.987 回答
2

看起来您复制了富文本。单引号应该是直的而不是卷曲的:

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' 
于 2013-02-13T04:20:06.153 回答