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

$1sed への特別なコマンドとして解析される何かが含まれています。この場合、おそらく/置換文字列の終わりを示す a の後に他の文字が続きます。

最初に置換文字列をエスケープする必要があります: Escape a string for a sed replace pattern .

于 2012-07-18T22:19:40.487 に答える