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/&...

问题描述:

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

#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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用