我正在尝试在 MacOSX 终端上运行此命令,该终端最初打算在 Linux 上运行
sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis' init.txt >> ~/.bash_profile
但它给了我错误:
command i expects \ followed by text.
有什么办法可以修改上述命令以在 MacOSX 终端上工作
避难所是对的,但还有另一种方法可以做到。在将$'...'
字符串传递给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 上的这个答案让我找到了这个解决方案。
有同样的问题并用brew解决了:
brew install gnu-sed
gsed YOUR_USUAL_SED_COMMAND
如果你想使用 sed 命令,那么你可以设置一个别名:
alias sed=gsed
OSXsed
是基于旧版本的,你需要在 sed 的方向上更加直截了当,而且你很幸运,在这种情况下,sed
它会准确地告诉你该做什么。未经测试,因为我没有 OSX,但请尝试
sed '1 i\
VISPATH=/mnt/local/gdrive/public/3DVis
' init.txt >> ~/.bash_profile
通过i
cmd 输入的内容以空行结束。之后可以遵循其他 sed 指令。注意,字符后没有\
字符!
另外,@StephenNiedzielski 是对的。使用单引号字符来包装您的 sed 语句。(如果您需要在您的 sed 中进行变量扩展并且可以逃避 的其他用途$
,那么您也可以使用 dbl-quotes,但不建议将其作为常规做法。
编辑
据我所知,您是从命令行执行此操作,而不是在脚本或其他编辑器中执行此操作,我已经测试了上述内容,并且....我只能说来自技术支持的那句著名的行... “这个对我有用”。如果您收到错误消息
sed: -e expression #1, char 8: extra characters after command
那么你几乎可以肯定在 . 之后添加了一些字符 \
。我刚刚测试过,我收到了上面的错误信息。(我使用的是 sed 的 linux 版本,因此错误消息完全相同)。您应该编辑您的问题以包含命令行的精确剪切粘贴和新的错误消息。使用卷曲单引号将不起作用。
IHTH
这是我在 OS X 上的解决方法。就我而言,我需要将文本添加到文件中。显然,现代 sed 是这样工作的:
sed -i '1i text to prepend' file.txt
但在 OS XI 上必须执行以下操作:
sed -i '' '1i\
text to prepend
' file.txt
看起来您复制了富文本。单引号应该是直的而不是卷曲的:
sed '1 i VISPATH=/mnt/local/gdrive/public/3DVis'