sed 中的环境变量替换
- 2024-10-09 09:10:00
- admin 原创
- 77
问题描述:
如果我从脚本运行这些命令:
#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 将 a 识别$var
为 shell 中定义的环境变量?
解决方案 1:
您的两个示例看起来完全相同,这使得问题难以诊断。潜在问题:
您可能需要双引号,例如
sed 's/xxx/'"$PWD"'/'
$PWD
可能包含斜线,在这种情况下您需要找到不包含在中的字符$PWD
作为分隔符。
为了同时解决这两个问题,也许
sed 's@xxx@'"$PWD"'@'
解决方案 2:
除了 Norman Ramsey 的回答之外,我想补充一点,您可以用双引号括住整个字符串(这可能会使语句更具可读性且不易出错)。
因此,如果您想搜索“foo”并将其替换为 $BAR 的内容,您可以将 sed 命令括在双引号中。
sed 's/foo/$BAR/g'
sed "s/foo/$BAR/g"
在第一个情况下,$BAR 将无法正确扩展,而在第二个情况下,$BAR 将正确扩展。
解决方案 3:
另一个简单的选择:
由于$PWD
通常包含斜线/
,因此在 sed 语句中使用|
而不是:/
sed -e "s|xxx|$PWD|"
解决方案 4:
您可以使用除“/”之外的其他字符进行替换:
sed "s#$1#$2#g" -i FILE
解决方案 5:
一、不好的做法:改变分隔符
sed 's/xxx/'"$PWD"'/'
sed 's:xxx:'"$PWD"':'
sed 's@xxx@'"$PWD"'@'
也许这些不是最终答案,
你无法知道在$PWD
,/
:
或 中会出现什么字符@
。
如果分隔符字符在 $PWD 中,它们会破坏表达式
好的方法是替换(转义)中的特殊字符$PWD
。
二、好办法:转义分隔符
例如:尝试替换URL
为 $url (:
/
内容中有)
x.com:80/aa/bb/aa.js
在字符串 $tmp 中
<a href="URL">URL</a>
A.用作/
分隔符
/
像var 一样转义/
(在 sed 表达式中使用之前)
## step 1: try escape
echo ${url////\/}
x.com:80/aa/bb/aa.js #escape fine
echo ${url/////}
x.com:80/aa/bb/aa.js #escape not success
echo "${url/////}"
x.com:80/aa/bb/aa.js #escape fine, notice `"`
## step 2: do sed
echo $tmp | sed "s/URL/${url////\/}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
echo $tmp | sed "s/URL/${url/////}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
或者
B. 用作:
分隔符(比 更易读/
)
:
像var 一样转义:
(在 sed 表达式中使用之前)
## step 1: try escape
echo ${url//:/:}
x.com:80/aa/bb/aa.js #escape not success
echo "${url//:/:}"
x.com:80/aa/bb/aa.js #escape fine, notice `"`
## step 2: do sed
echo $tmp | sed "s:URL:${url//:/:}:g"
<a href="x.com:80/aa/bb/aa.js">x.com:80/aa/bb/aa.js</a>
解决方案 6:
通过编辑您的问题,我明白了您的问题。假设当前目录是/home/yourname
...在这种情况下,您的命令如下:
sed 's/xxx/'$PWD'/'
将扩大至
sed `s/xxx//home/yourname//
这是无效的。如果你想这样做,你需要`在 $PWD 中的每个字符前面放置一个字符。
/`
解决方案 7:
实际上,最简单的方法(至少在 GNU sed 中)是使用不同的分隔符作为 sed 替换 ( s
) 命令。因此,不要将s/pattern/'$mypath'/
其扩展为s/pattern//my/path/
,这当然会使s
命令混淆,而是使用s!pattern!'$mypath'!
,它将扩展为s!pattern!/my/path!
。我使用了感叹号 ( !
) 字符(或使用任何您喜欢的字符),这样可以避免使用通常但绝非唯一选择的正斜杠作为分隔符。
解决方案 8:
VAR=8675309
echo "abcde:jhdfj$jhbsfiy/.hghi$jh:12345:dgve::" |\nsed 's/:[0-9]*:/:'$VAR':/1'
其中VAR
包含要替换字段的内容
解决方案 9:
在 sed 中处理变量
[root@gislab00207 ldom]# echo domainname: None > /tmp/1.txt
[root@gislab00207 ldom]# cat /tmp/1.txt
domainname: None
[root@gislab00207 ldom]# echo ${DOMAIN_NAME}
dcsw-79-98vm.us.oracle.com
[root@gislab00207 ldom]# cat /tmp/1.txt | sed -e 's/domainname: None/domainname: ${DOMAIN_NAME}/g'
--- Below is the result -- very funny.
domainname: ${DOMAIN_NAME}
--- You need to single quote your variable like this ...
[root@gislab00207 ldom]# cat /tmp/1.txt | sed -e 's/domainname: None/domainname: '${DOMAIN_NAME}'/g'
--- The right result is below
domainname: dcsw-79-98vm.us.oracle.com
解决方案 10:
对于我来说,使用 sed 替换文件中环境变量的值的某些文本仅适用于配额,如下所示:
sed -i 's/original_value/'"$MY_ENVIRNONMENT_VARIABLE"'/g' myfile.txt
但是当 MY_ENVIRONMENT_VARIABLE 的值包含 URL(即https://andreas.gr)时,上述方法不起作用。然后使用不同的分隔符:
sed -i "s|original_value|$MY_ENVIRNONMENT_VARIABLE|g" myfile.txt
解决方案 11:
如果您的替换字符串可能包含其他sed 控制字符,那么两步替换(首先转义替换字符串)可能是您想要的:
PWD='/a&b$_' # these are problematic for sed
PWD_ESC=$(printf '%s
' "$PWD" | sed -e 's/[/&]/\&/g')
echo 'xxx' | sed "s/xxx/$PWD_ESC/" # now this works as expected
解决方案 12:
我遇到了类似的问题,我有一个列表,我必须根据模板(包含@INPUT@
要替换的元素)构建一个 SQL 脚本:
for i in LIST
do
awk "sub(/@INPUT@/,\"${i}\");" template.sql >> output
done
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件