如何用文件中的绝对路径替换变量值?

时间:2013-10-10 11:37:48

标签: linux bash unix sed

我想搜索变量并用文件中的绝对路径替换。

setenv ABC /home/xyz
cat file.txt
${ABC}/Test/Folder_1
${ABC}/Test/Folder_2

我想用/ home / xyz替换$ {ABC}的所有出现。 我尝试了下面提到的方法,但是没有用,

sed -i 's/\$ABC/echo $ABC/g' file.txt

我可以通过下面提到的方式来做,但我不想这样做。(我必须把这么多反斜杠)

$ echo $ABC | sed -i 's/\$ABC/\/home\/xyz/g' file.txt

请给我一些关于这个问题的建议。

谢谢。

3 个答案:

答案 0 :(得分:1)

如果您确实想要使用替换字符串中变量的值,可以使用

sed "s#\${ABC}#$ABC#g" file.txt

答案 1 :(得分:1)

ssed之后的字符是分隔符,它可以是您选择的任何一个字符,只要它不在string-to-be-matchedstring-to-be-replaced中,它就会起作用

示例:

sed 's:string-to-be-matched:string-to-be-replaced:g' file-to-be-edited

:是分隔符

g意味着全球替代。


在您的情况下,由于string-to-be-replaced包含/,因此您使用的是sed分隔符。

简单解决方案将是:

sed -i 's:${ABC}:'"$ABC"':g' fill.txt

'"位于替换字符串中$ ABC的两端。目的是扩展shell变量以与sed

一起使用

答案 2 :(得分:0)

获得绝对路径的另一种方法是readlink -f ${ABC}/Test/Folder_2

或者你的斜线饥饿命令的perl替代

$ echo $ABC | sed -i 's/\$ABC/\/home\/xyz/g' file.txt

将是

$ echo $ABC | perl -p -i -e 's!\$ABC!/home/xyz!g'

上面's之后的第一个字符将用作替换表达式中的分隔符(即's@foo@bar@g'