问答

sed 引用变量问题

作者:admin 2021-08-09 我要评论

sed 引用变量不成功,表达式问题导致出现如下等错误: sed:-e 表达式 #1,字符 12:命令后含有多余的字符sed:-e 表达式 #1,字符 29:未终止的“s”命令 替换...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

sed 引用变量不成功,表达式问题导致出现如下等错误:

sed:-e 表达式 #1,字符 12:命令后含有多余的字符

sed:-e 表达式 #1,字符 29:未终止的“s”命令

替换的目标变量有多段文字,由于sed命令中的转义符或者引号使用不对,增加的文字中第二行的字母e被sed认为是循环执行命令,无法被当作整段文字直接插入导致出错。

问题出现的环境背景及自己尝试过哪些方法

使用shell sed语句中的s命令或者a命令,试了多种引号和转义都没有试出来。

使用sed的r命令读取临时文件方式可行,但没有使用变量方便:

#!/bin/bash

sed -n '/profile/,/EOF-profile/p' src.txt| sed -n 2,8p > /tmp/tmp1

sed -i '/<configuration>/r /tmp/tmp1' dst.txt

相关代码

head -10 src.txt

#profile

#JAVA_HOME

export JAVA_HOME=/opt/module/jdk1.8.0_144

export PATH=$PATH:$JAVA_HOME/bin

#EOF-profile

cat dst.txt

<!-- Put specific property overrides in this file. -->

<configuration>

#---->增加src文件中的部分内容<-----

</configuration>

cat ap5.sh

#!/bin/bash

dst1="`sed -n '/profile/,/EOF-profile/p' src.txt| sed -n 2,4p`" #读取src.txt需要增加的部分配置内容

 sed "/<configuration>/a "${dst1}"" dst.txt #在<configuration>下一行插入需要的配置语句,但是dst1中第二行的e被sed认为是循环执行,无法被当作整段文字直接插入导致出错。

错误信息:

 sed "/<configuration>/a "${dst1}"" dst.txt

sed:无法读取 export:没有那个文件或目录

sed:无法读取 JAVA_HOME=/opt/module/jdk1.8.0_144:没有那个文件或目录

sed:无法读取 export:没有那个文件或目录

sed:无法读取 PATH=$PATH:$JAVA_HOME/bin:没有那个文件或目录

<!-- Put specific property overrides in this file. -->

<configuration>

#JAVA_HOME

</configuration>

问题请教:如何修改下边的sed命令转义或者使用其它命令方式,完成目标内容增加?求指点,谢谢!

 sed "/<configuration>/a "${dst1}"" dst.txt
###

准备条件
echo "$a"

第一行文本
第二行文本
第三行文本

echo "$b"

第一行文本\n第二行文本\n第三行文本

cat /tmp/testxml.xml

<!-- Put specific property overrides in this file. -->

<configuration>

#---->增加src文件中的部分内容<-----

</configuration>

你可以使用awk,awk命令支持传入外部变量作为内部变量使用(使用 -v 选项传递外部参数)。
尤其是需要处理多行文本和复杂需求的时候,awk比sed要强大和灵活。

awk -v a="$a" '/<configuration>/{print;print a;next};{print}' /tmp/testxml.xml

<!-- Put specific property overrides in this file. -->

<configuration>
第一行文本
第二行文本
第三行文本

#---->增加src文件中的部分内容<-----

</configuration>

如果你非得使用sed,而且又不想使用临时文件,那sed内部使用的变量只能是单行字符串,如果是多行字符串,你得把换行先转义,替换成类似这样的形式(123\n456\n789)。然后sed表达式外部直接使用双引号(不用单引号),同样能达到你需要的效果。先替换换行再传递变量,否则你直接在sed中引用该变量就会报错。
sed "/<configuration>/a$a" /tmp/testxml.xml

sed:-e 表达式 #1,字符 35:未知的命令:“?”

sed "/<configuration>/a$b" /tmp/testxml.xml

<!-- Put specific property overrides in this file. -->

<configuration>
第一行文本
第二行文本
第三行文本

#---->增加src文件中的部分内容<-----

</configuration>

image.png

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • sed 引用变量问题

    sed 引用变量问题

  • mint-ui的checklist点击选项没反应,怎

    mint-ui的checklist点击选项没反应,怎

  • MySQL 时间区间判断是否重复

    MySQL 时间区间判断是否重复

  • 怎么才能更好地处理populate关联数据表

    怎么才能更好地处理populate关联数据表

腾讯云代理商
海外云服务器