首页 > 解决方案 > 将字符串变量值插入到 ksh 中另一个字符串变量值的中间

问题描述

所以我有一个包含大约 50 个字符的变量 TRAILER。这个变量是在我的 shell 会话中定义的。您可能会说,这是我们将要发送的文件的预告片。我需要将该文件的记录计数插入到预告片中。此记录计数将是 9 位长(如果需要,左填充零)并将从该字符串 TRAILER 的索引 2 开始。我想保留 TRAILER 字符串中的所有其他字符,只需将 RECORD_COUNT 变量值插入到从索引 2(第 3 个字符)开始的 TRAILER 变量中

所以预告片变量是这样定义的:

#Trailer details
TRAILER_RECORD_IDENTIFER="T"
LIFE_CYCLE="${LIFE_CYCLE_ENV}"
RECORD_COUNT="" #This will be calculated in the wrapper during the creation step
FILE_NUMBER="1111"
FILE_COUNT="1111"
CONTROL_TOTAL_1="               "
CONTROL_TOTAL_2="               "
CONTROL_TOTAL_3="               "
CONTROL_TOTAL_4="               "
CONTROL_TOTAL_5="               "
TRAILER="${TRAILER_RECORD_IDENTIFER}"\
"${LIFE_CYCLE}"\
"${RECORD_COUNT}"\
"${FILE_NUMBER}"\
"${FILE_COUNT}"\
"${CONTROL_TOTAL_1}"\
"${CONTROL_TOTAL_2}"\
"${CONTROL_TOTAL_3}"\
"${CONTROL_TOTAL_4}"\
"${CONTROL_TOTAL_5}"

然后将 TRAILER 打印为 TRAILER="TD11111111......" 这将是 CONTROL_TOTAL 变量定义的所有白色字符的 75 个空格。

这些变量都在 shell 的开头定义。REcord count 已定义但留空,因为直到稍后进入 shell 时我们才会知道具体的文件。

后来在shell中我知道了我想使用的文件,我得到了记录:

cat ${ADE_DATA_FL_PATH_TMP} | wc -l | read ADE_DATA_FL_PATH_TMP_REC_COUNT >> ${LOG_FILE} 2>&1

现在我想获取 ADE_DATA_FL_PATH_TMP_REC_COUNT 并将该值写入从第二个索引开始的 TRAILER 变量,用零填充为 9 个字符长。因此,如果我的记录数是 2700 条记录,那么新预告片看起来像...... TRAILER="TD00000270011111111......"

标签: bashunixksh

解决方案


您可以使用 printf 进行填充。我使用TD固定的前两个字符,你可以按照你想要的方式改变它。

printf -v TRAILER "TD%.9d%s" "${ADE_DATA_FL_PATH_TMP_REC_COUNT}" "$(cut -c 12- <<< "${TRAILER}")" 

也许这是切换到以小写形式编写变量名的好时机。


推荐阅读