linux - 用另一个变量替换文本文件中的变量
问题描述
我正在尝试将变量写入文本文件中的特定位置。
到目前为止,我已经完成了变量生成部分,但是当我打开文本文件查看结果时,${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 声明中?
解决方案
这是一个危险的操作:
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
脚本,只需从片段构建输出。
推荐阅读
- c# - Semaphore slim 可处理每个时间段的节流
- matrix - 是否可以在下三角距离矩阵上计算 SIMPROF?
- android - Android API 级别 30,无法再从 Android arp 表中获取 wifi 网络设备 MAC 地址
- javascript - 如何使用 Flask 在 PostgreSQL 中存储行?
- python - 如何做到这一点,以便我可以将按钮应用于我想要的任何窗口?
- javascript - 如何从javascript中的字符串创建对象属性函数?
- python - 在 matplotlib 中更改 yaxis 数字格式
- azure - Azure 函数(由容器支持)运行两个 docker 映像,即使缩放设置为 1
- python - 根据日期和 ID 自定义排序大型 Json
- mysql - 这个SQL语句是有效的,还是MySQL正确的报错?