我有以下代码:
sed -i "/#alias/a alias ll='ls -laGh'" /etc/zshrc
sed -i "/#alias/a alias l='ls -l'" /etc/zshrc
在文件 /etc/zshrc 我有:
#alias
但是在执行代码时它会抛出以下错误:
sed: 1: "/etc/zshrc": invalid command code z
我不明白会发生什么
应该:
#alias
alias ll='ls -laGh'
alias l='ls -l'
它不能为我服务:
#alias
alias ll='ls -laGh' alias l='ls -l'
这里有两个问题。第一个是 macOS 版本的选项
sed
需要一个明确的参数,-i
告诉它备份文件使用什么扩展名;如果您不想要备份,则需要在其后传递一个空参数 (sed -i '' ...
)。在stackoverflow上看到这个和这个。第二个问题是该
a
命令在要添加的字符串之前需要一个转义的换行符,然后是一个换行符。从[man
页面]:考虑到这两个,这应该做你想要的:
如果您想避免在命令字符串中显式换行,您可以定义
nl=$'\n'
,然后使用${nl}
而不是显式换行。如果您想一次添加多行,我倾向于使用循环来构造一个sed
命令,该命令将一次性添加所有行:或者,如果您更喜欢运行多个命令:
如果最后一个选项仍然不起作用,请运行
set -x
然后重试。假设您使用的是 zsh,您应该会看到类似这样的内容:(只有数字
+zsh:something
会有所不同,而且还有很多与更新终端 cwd 无关的东西。)我能想到的唯一原因是将所有内容放在一行中,如果换行符在末尾缺少sed
命令:顺便说一句,用于
set +x
关闭调试跟踪。