MACOS X上的SED命令错误

use*_*030 17 macos sed

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

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' init.txt >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

但它给了我错误:

command i expects \ followed by text. 
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ehs 32

避难所是正确的,但还有另一种方法可以做到这一点.$'...'在将字符串传递给之前,您可以使用bash 引用来解释转义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
Run Code Online (Sandbox Code Playgroud)

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


eri*_*ker 14

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

brew install gnu-sed

gsed YOUR_USUAL_SED_COMMAND

如果要使用sed命令,则可以设置别名:

alias sed=gsed

  • 或者,您可以在末尾安装带有"--with-default-names"选项的`gnu-sed`,因此安装的gnu-sed将具有`sed`名称. (2认同)

she*_*ter 5

OSX sed基于旧版本,你需要在你的方向上更加文字化,并且你很幸运,在这种情况下,它sed正在告诉你究竟该做什么.未经测试,因为我没有OSX,但试试

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

' init.txt >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

通过icmd 输入由空行终止.之后可以使用其他sed说明.注意,char后没有\字符!

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

编辑

正如我现在所理解的那样,你是从命令行进行的,而不是在脚本或其他编辑器中,我已经测试了上面的内容,并且....我只能说是来自技术支持的着名线路...... "这个对我有用".如果您收到错误消息

sed: -e expression #1, char 8: extra characters after command
Run Code Online (Sandbox Code Playgroud)

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

IHTH


Dyl*_*lan 5

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

sed -i '1i text to prepend' file.txt
Run Code Online (Sandbox Code Playgroud)

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

sed -i '' '1i\
text to prepend
' file.txt
Run Code Online (Sandbox Code Playgroud)


Ste*_*ski 2

您似乎复制了富文本。单引号应该是直的而不是弯的:

sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' 
Run Code Online (Sandbox Code Playgroud)