替换参数中的关键字 - bash脚本

时间:2012-06-08 22:08:32

标签: bash sed

我有一个文件以路径作为参数:

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

我想要做的是将/ path / to / ...部分替换为/ another / file /...

我试图以下列方式提出论点:

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

但这不起作用,因为sed试图在CUR_PATH上实际修改文件,而不是CUR_PATH的实际语句。我该如何解决?感谢。

3 个答案:

答案 0 :(得分:2)

您不需要sedbash内置的变量替换。您可以使用:

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

请注意/的反斜杠,因为表达式为${variable/old/new}

答案 1 :(得分:2)

您可以像迭戈建议的那样使用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@ )

答案 2 :(得分:2)

另一种可能性是使用here字符串:

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

另请注意,您可以更改sed中替换的分隔符,这样您就不必转义路径变量中的斜杠。