1

我正在尝试将 sed 命令的开头存储在这样的变量中:

sedcmd="sed -i '' "

稍后我执行如下命令:

   $sedcmd s/$orig_pkg/$package_name/g $f

它不起作用。使用 bash -x 运行脚本,我可以看到它正在被扩展为:

   sed -i ''\'''\''' 

正确的表达方式是什么?

4

5 回答 5

3

定义一个外壳函数:

mysed () {
    sed -i "" "$@"
}

并这样称呼它:

$ mysed s/$orig_pkg/$package_name/g $f
于 2013-05-08T14:30:46.027 回答
2

它在命令只有一个字长时起作用:

$ LS=ls
$ $LS

但在您的情况下,shell 正在尝试执行不存在的程序。 sed -i ''

解决方法是使用$SHELL -c

$ $SHELL -c "$LS"
total 0

$SHELL您也可以说bash,而不是 ,但是当有多个 Bash 安装时,这并不完全可靠,shell 实际上不是 Bash 等)

但是,在大多数情况下,我实际上会使用 shell 函数:

sedcmd () {
    sed -i '' "$@"
}
于 2013-05-08T14:04:42.730 回答
0

为什么不使用别名或函数?你可以做别名

alias sedcmd="sed -i '' "
于 2013-05-08T14:03:20.710 回答
0

这是这样做的正确方法

alias sedcmd="sed -i ''"

显然请记住,当您关闭 bash 时,此别名将消失。
如果你想让它“永久”,你必须将它添加到你的.bashrc主文件(如果你想只为单个用户制作)或.bashrc全局文件,如果你想让它对所有用户可用

于 2013-05-08T14:03:29.940 回答
0

不完全确定您要做什么,但我的建议是:

sedcmd="sed -i "
$sedcmd s/$orig_pkg/$package_name/g $f

您必须首先在 shell 中设置变量orig_pkg package_namef

如果要替换文件中的变量名,请尝试:

$sedcmd s/\$orig_pkg/\$package_name/g $f

仍然f必须设置为您正在处理的文件名。

于 2013-05-08T14:23:38.530 回答