1

パスを引数として取っているファイルがあります:

./<filename> /path/to/file...

私がやりたいのは、 /path/to/... 部分を /another/file/... に置き換えることです

私は次の方法で引数をsedしようとしていました:

CUR_PATH=$1
OLD_PATH="\/path\/to\/"
NEW_PATH="\/another\/file\/"
sed "s/$OLD_PATH/$NEW_PATH/" $CUR_PATH

しかし、sed が CUR_PATH の実際のステートメントではなく、CUR_PATH のファイルを実際に変更しようとしているため、これは機能しません。これを修正するにはどうすればよいですか? ありがとう。

4

3 に答える 3

2

必要ありませんsedbash変数の組み込み置換。以下を使用できます。

NEW_PATH=${OLD_PATH/\/path\/to\//\/another\/file\/}

/式が であるため、のバックスラッシュに注意してください${variable/old/new}

于 2012-06-08T22:13:08.430 に答える
2

Diego が提案するように bash の置換を使用できますが、この特定のケースでは、おそらく実行する方がクリーンです。

NEW_PATH="/another/file/${OLD_PATH##*/}"

これにより、OLD_PATH の先頭パス全体が文字列 "/another/file/" に置き換えられます。二重引用符は、OLD_PATH に空白が含まれる可能性がある場合にのみ必要であることに注意してください。

sed を使用したい場合は、単純に OLD_PATH をパイプにエコーすることができます。また、sed を使用してファイル名を操作する場合は、別のセパレータを使用すると便利です。例えば:

NEW_PATH=$( echo $OLD_PATH | sed s@/path/to/my@/another/file@ )
于 2012-06-08T22:21:20.463 に答える
2

もう 1 つの可能性は、here 文字列を使用することです。

CUR_PATH=$1
OLD_PATH="/path/to/"
NEW_PATH="/another/file/"
sed "s|$OLD_PATH|$NEW_PATH|" <<< $CUR_PATH

また、パス変数のスラッシュをエスケープする必要がないように、sed の置換の区切り文字を変更できることにも注意してください。

于 2012-06-08T22:29:22.230 に答える