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##*/}"

它将用字符串“/another/file/”替换 OLD_PATH 的整个前导路径。请注意,仅当 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

另一种可能性是使用 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 回答