我正在尝试将 sed 命令的开头存储在这样的变量中:
sedcmd="sed -i '' "
稍后我执行如下命令:
$sedcmd s/$orig_pkg/$package_name/g $f
它不起作用。使用 bash -x 运行脚本,我可以看到它正在被扩展为:
sed -i ''\'''\'''
正确的表达方式是什么?
我正在尝试将 sed 命令的开头存储在这样的变量中:
sedcmd="sed -i '' "
稍后我执行如下命令:
$sedcmd s/$orig_pkg/$package_name/g $f
它不起作用。使用 bash -x 运行脚本,我可以看到它正在被扩展为:
sed -i ''\'''\'''
正确的表达方式是什么?
定义一个外壳函数:
mysed () {
sed -i "" "$@"
}
并这样称呼它:
$ mysed s/$orig_pkg/$package_name/g $f
它在命令只有一个字长时起作用:
$ LS=ls
$ $LS
但在您的情况下,shell 正在尝试执行不存在的程序。 sed -i ''
解决方法是使用$SHELL -c
:
$ $SHELL -c "$LS"
total 0
($SHELL
您也可以说bash
,而不是 ,但是当有多个 Bash 安装时,这并不完全可靠,shell 实际上不是 Bash 等)
但是,在大多数情况下,我实际上会使用 shell 函数:
sedcmd () {
sed -i '' "$@"
}
为什么不使用别名或函数?你可以做别名
alias sedcmd="sed -i '' "
这是这样做的正确方法
alias sedcmd="sed -i ''"
显然请记住,当您关闭 bash 时,此别名将消失。
如果你想让它“永久”,你必须将它添加到你的.bashrc
主文件(如果你想只为单个用户制作)或.bashrc
全局文件,如果你想让它对所有用户可用
不完全确定您要做什么,但我的建议是:
sedcmd="sed -i "
$sedcmd s/$orig_pkg/$package_name/g $f
您必须首先在 shell 中设置变量orig_pkg
package_name
和f
。
如果要替换文件中的变量名,请尝试:
$sedcmd s/\$orig_pkg/\$package_name/g $f
仍然f
必须设置为您正在处理的文件名。