用另一个变量替换文本文件中的变量

时间:2019-01-29 14:09:18

标签: linux bash

我正在尝试将变量写入文本文件中的特定位置。

到目前为止,我已经完成了变量生成部分,但是当我打开文本文件查看结果时,${at}占位符已替换为${assetTag}而不是变量的值。 / p>

set -x # Print each line of script

set -e # Print error codes for debugging

serialNum=$(dmidecode -s chassis-asset-tag) 

assetTag=$(awk -e '$1 == "'"$serialNum"'"{print $2; q}' /tmp/AssetTag.txt)

cat /tmp/BIOS.txt | sed -e "s/{$aT}/$assetTag/" >> /tmp/BIOS.txt

exit  0

因此,我的想法是将$serialNum与包含序列号和资产标签的文件进行比较。从那里,我将相应的资产标签写入$assetTag。之后,我需要将文本文件中的$aT占位符替换为$assetTag值,并保存文件以上传到系统中。

BIOS.txt excerpt

... <br>
Asset Tracking Number <br>
    ${aT} <br>
Ownership Tag <br>

Product Name <br>
    Thin Client <br>
...<br>


BIOS.txt excerpt after running script

... <br>
Asset Tracking Number <br>
    ${assetTag} <br>
Ownership Tag <br>

Product Name <br>
    Thin Client <br>
...<br>

编辑:

我尝试编辑文件的部分原因是我使用的脚本引擎最多包含4096个字符。过去我做过“ cat> /tmp/Rename.txt << EOL”,然后简单地在脚本引擎中写出了整个文件。但是,这使我处于极限,因此我没有更多的空间来添加代码。因此,如果我可以编辑复制到瘦客户端的现有文件...,则可以在脚本中保存实际代码行,而不用于文件构建。

编辑:

好的,所以我在Asset_Tag.txt文件中的资产标签的末尾找到了回车符。从而导致当前的头痛。

assetTag=$(awk -e '$1 == "'"$serialNum"'"{print $2; q}' /tmp/AssetTag.txt)

sed -e "s/@aT@/$assetTag/" /tmp/T630_BIOS.txt > /tmp/BIOS.txt

所以问题是我是否需要在某个地方放置tr -d '\r'。在assetTag声明中?

2 个答案:

答案 0 :(得分:0)

这是危险的操作:

cat file | cmd >> file

它将同时打开文件进行读取和修改。如果操作系统没有阻止您,那将是一个无休止的循环(猫正在读取内容,将cmd添加到文件中,使用cmd读取新输入...)。

我建议您将输出写入新文件,以避免各种奇怪的问题。

也就是说,模式{$aT}将永远与输入${aT}不匹配。为了匹配输入,您需要以下正则表达式:\${aT},但是您使用的是双引号,因此BASH可能会在sed看到反斜杠之前就使用反斜杠。检查set -x提供的调试输出。确保反斜杠仍然存在。如果不起作用,请尝试使用\\${aT}或单引号-但单引号会影响$assetTag的扩展,因此您将需要使用与{{ 1}}脚本。

这就是为什么许多基于​​BASH的模板引擎使用不同的前缀,如awk而不是@的原因:$(无花括号)或@aT@

或者这可能更简单:

@{aT}

即而不是复杂的cat header.tmpl > /tmp/BIOS.txt echo "$assetTag" >> /tmp/BIOS.txt cat footer.tmpl >> /tmp/BIOS.txt 脚本,只需从片段构建输出即可。

答案 1 :(得分:0)

这似乎是解决方法。卸下回车符后,文件将正确附加,BIOS更新程序将正常运行。感谢亚伦·迪古拉(Aaron Digulla)为我指出正确的方向!

serialNum=$(dmidecode -s chassis-asset-tag)
aTag=$(awk -e '$1 == "'"$serialNum"'"{printf $2; q}' /tmp/AssetTag.txt)

assetTag=$(echo $aTag | tr -d '\r' )

sed -e "s/@aT@/$assetTag/" /tmp/BIOS.txt > /tmp/BIOS_new.txt