1

这是我当前的代码。我正在尝试用另一个文件名替换文件中的文件名字符串。但我目前收到错误

"sed: 1: "s/directory = "[A-Za-z0 ...": 替代命令中的错误标志:'U'"

这段代码有什么问题?

function restart_existing ()
{
    old="directory = \"[A-Za-z0-9\/]\""
    new="directory = \"$1\""
    sed -i '' "s/$old/$new/" "$HOME/angelpretendconfig" 
}


restart_existing "$HOME/blahblahblah/shoot/blah"

编辑:谢谢!我采纳了您的建议,并修改了代码。

function restart_existing ()
{
    old="directory = \"*\""
    printf -v new 'directory = "%s"' "$1"
    sed -i '' "s;$old;$new;" "$HOME/angelpretendconfig" 
}

restart_existing "Query"

但是现在有问题的行来自

directory = "/home/jamie/bump/server"
directory = "Query"/home/jamie/bump/server"

为什么会出现这种情况?

4

2 回答 2

7

当您要替换的内容包含正斜杠时,请勿在 sed 中使用正斜杠:

$ sed 's;foo/bar;baz/wuz;' <<< "where is the foo/bar?"
where is the baz/wuz?

此外,有时避免手动转义引号更具可读性:

function restart_existing ()
{
    old='directory = "[A-Za-z0-9\/]"'
    printf -v new 'directory = "%s"' "$1"
    sed -i '' "s;$old;$new;" "$HOME/angelpretendconfig" 
}

restart_existing "$HOME/blahblahblah/shoot/blah"
于 2012-07-18T22:14:14.763 回答
1

$1包含一些东西,它被解析为 sed 的特殊命令,在这种情况下可能是 a/标记替换字符串的结尾,后跟一些其他字符。

您必须先转义替换字符串:为 sed 替换模式转义字符串

于 2012-07-18T22:19:40.487 回答