首页 > 解决方案 > 用另一个变量替换文本文件中的变量

问题描述

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

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

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 文件中的 Asset Tag 末尾找到了回车。所以这导致了当前的头痛。

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 声明中?

标签: linuxbash

解决方案


这是一个危险的操作:

cat file | cmd >> file

它将打开文件进行读取和修改。如果操作系统没有阻止您,那将是一个无限循环(cat 读取某些内容,cmd 添加到文件中,cmd 读取该新输入...)。

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

也就是说,模式{$aT}永远不会匹配 input ${aT}。要匹配输入,您需要这个正则表达式:\${aT}但您使用的是双引号,因此 BASH 可能会在sed看到反斜杠之前吃掉它。检查提供的调试输出set -x。确保反斜杠仍然存在。如果它不起作用,请尝试使用\\${aT}单引号 - 但单引号会与扩展混淆$assetTag,因此您需要在awk脚本中使用相同的双单引号技巧。

这就是为什么许多基于​​ BASH 的模板引擎使用不同的前缀@而不是$: @aT@(没有花括号)或@{aT}

或者这可能更简单:

cat header.tmpl > /tmp/BIOS.txt
echo "$assetTag" >> /tmp/BIOS.txt
cat footer.tmpl >> /tmp/BIOS.txt

即,而不是复杂的sed脚本,只需从片段构建输出。


推荐阅读