如果我从脚本运行这些命令:
#my.sh PWD=bla sed 's/xxx/'$PWD'/' ... $ ./my.sh xxx bla
没事.
但是,如果我跑:
#my.sh sed 's/xxx/'$PWD'/' ... $ ./my.sh $ sed: -e expression #1, char 8: Unknown option to `s'
我在教程中读到要替换你需要停止的shell中的环境变量,并且"引用"该$varname
部分以便它不直接替换,这就是我所做的,并且只有在之前定义变量时才有效.
我怎样才能将sed识别$var
为在shell中定义的环境变量?
您的两个示例看起来完全相同,这使问题难以诊断.潜在问题:
您可能需要双引号,如 sed 's/xxx/'"$PWD"'/'
$PWD
可能包含斜杠,在这种情况下,您需要找到一个未包含的字符$PWD
用作分隔符.
或许可以立刻解决这两个问题
sed 's@xxx@'"$PWD"'@'
除了Norman Ramsey的回答之外,我还想补充一点,你可以对整个字符串进行双引号(这可能使语句更具可读性,更不容易出错).
因此,如果您要搜索"foo"并将其替换为$ BAR的内容,则可以将sed命令括在双引号中.
sed 's/foo/$BAR/g' sed "s/foo/$BAR/g"
在第一个,$ BAR将无法正确扩展,而在第二个$ BAR将正确扩展.
您可以使用除"/"之外的其他字符替换:
sed "s#$1#$2#g" -i FILE
另一种简单的选择
由于$PWD
通常会包含斜杠/
,因此使用|
而不是/
sed语句:
sed -e "s|xxx|$PWD|"
编辑问题后,我会看到您的问题.假设当前目录是/home/yourname
...在这种情况下,您的命令如下:
sed 's/xxx/'$PWD'/'
将扩大到
sed `s/xxx//home/yourname//
这是无效的.如果你想这样做,你需要在你的$ PWD中放一个\
角色/
.