当前位置:  开发笔记 > 编程语言 > 正文

sed中的环境变量替换

如何解决《sed中的环境变量替换》经验,为你挑选了5个好方法。

如果我从脚本运行这些命令:

#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中定义的环境变量?



1> Norman Ramse..:

您的两个示例看起来完全相同,这使问题难以诊断.潜在问题:

    您可能需要双引号,如 sed 's/xxx/'"$PWD"'/'

    $PWD可能包含斜杠,在这种情况下,您需要找到一个包含的字符$PWD用作分隔符.

或许可以立刻解决这两个问题

sed 's@xxx@'"$PWD"'@'


你可以有几个候选人,比如@#%!并检查案例表达式以查找$ PWD是否具有它们.例如,*@*的案例"$ PWD";;*)delim ="@";; ESAC; 重复直到$ delim不为空.

2> Jeach..:

除了Norman Ramsey的回答之外,我还想补充一点,你可以对整个字符串进行双引号(这可能使语句更具可读性,更不容易出错).

因此,如果您要搜索"foo"并将其替换为$ BAR的内容,则可以将sed命令括在双引号中.

sed 's/foo/$BAR/g'
sed "s/foo/$BAR/g"

在第一个,$ BAR将无法正确扩展,而在第二个$ BAR将正确扩展.


这比弄乱双引号,单引号等更干净.
这很整洁,但是当你想做一些更复杂的替换时它就不能工作了,例如``2,$ s/^/$ foo /"```$ s`也被解释为变量而它不应该.

3> Paulo Fidalg..:

您可以使用除"/"之外的其他字符替换:

sed "s#$1#$2#g" -i FILE



4> Thales Ceoli..:

另一种简单的选择

由于$PWD通常会包含斜杠/,因此使用|而不是/sed语句:

sed -e "s|xxx|$PWD|"


您说"使用双引号的替代方法",但您的示例使用双引号?

5> Eddie..:

编辑问题后,我会看到您的问题.假设当前目录是/home/yourname ...在这种情况下,您的命令如下:

sed 's/xxx/'$PWD'/'

将扩大到

sed `s/xxx//home/yourname//

这是无效的.如果你想这样做,你需要在你的$ PWD中放一个\角色/.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有