sed 中的环境变量替换

2024-10-09 09:10:00
admin
原创
218
摘要:问题描述:如果我从脚本运行这些命令:#my.sh PWD=bla sed 's/xxx/'$PWD'/' ... $ ./my.sh xxx bla 很好。但是,如果我运行:#my.sh sed 's/xxx/&...

问题描述:

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

#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:

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

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

  2. $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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2545  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1551  
  建筑工程全生命周期涉及从项目规划、设计、施工到运营维护等多个复杂阶段,每个阶段都产生和依赖大量信息。PLM(产品生命周期管理)系统作为一种整合数据、流程和人员的数字化解决方案,正逐渐成为建筑行业实现高效协同与可持续发展的关键支撑。通过数字化转型,PLM系统能够优化各阶段的工作流程,提升项目整体质量和效率,为建筑工程的全...
plm是什么软件   1  
  产品生命周期管理(PLM)系统在企业资源成本率优化方面发挥着至关重要的作用。通过构建有效的数据模型,PLM系统能够整合企业各个环节的数据,为资源成本的精准分析和优化提供有力支持。这不仅有助于企业降低成本,还能提升产品质量和市场竞争力。PLM系统概述PLM系统是一种用于管理产品从概念设计到退役全生命周期过程中所有信息和流...
PLM项目管理软件   1  
  产品生命周期管理(PLM)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它整合了从产品概念设计到产品退役的全生命周期数据与流程,助力企业提升效率、降低成本并增强创新能力。随着技术的不断发展,到 2025 年,PLM 系统将具备一系列核心功能模块,这些模块将深度影响企业的运营与发展。产品数据管理模块产品...
plm是什么意思   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用