sed 中的环境变量替换

2024-10-09 09:10:00
admin
原创
198
摘要:问题描述:如果我从脚本运行这些命令:#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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用