如果我在 'printf' 语句中引用存储在 Bash 变量中的连字符(想想日期格式),如何转义它?



为了澄清,让我举一个例子。我有一个 csv 文件,我已经解析了其中的列,但是当我尝试引用包含日期的字段(格式为 15-Jun-2020(时,我的 printf 语句不知道如何转义它:

#Example csv content/placement (IGNORES.csv): C330001000,R3343,15-Jun-2020
while IFS=, read -r field1 field2 field3;
do
printf "UPDATE ODS.PERF_ACCT_ERR_DTL SET REC_ACTV_IND='T' WHERE BUS_DT='$field3' and ETL_ERR_CD='$field2' AND ACCT_KEY in (SELECT ACCT_KEY FROM ODS.ACCT_PORTFOLIO WHERE ACCT_SRCH_NBR='$field1');nCOMMIT;n"
done < IGNORES.csv > queryfile.sql

输出最终如下所示:

' and ETL_ERR_CD='R3343' AND ACCT_KEY in (SELECT ACCT_KEY FROM ODS.ACCT_PORTFOLIO WHERE ACCT_SRCH_NBR='C330001000');
COMMIT;

我尝试了一些我认为会有所帮助的奇怪转义字符组合,但到目前为止,我得到的最接近的是打印整个内容,但它不是显示 15-Jun-2020,而是显示 field3 作为输出。对于理解如何转义存储在变量中的某些内容有什么建议或参考吗?

-替换为-

如果您处理的只是连字符,则可以使用参数替换来查找和替换。

var="15-Jun-2020"
${var//-/\-}

故障

//双正斜杠表示参数替换中的全局查找和替换。

${var//PATTERN/REPLACEMENT VALUE}

输入文件显示为 Windows/DOS 格式。您可以使用dos2unix.有关更多信息,请参阅wooledge - 如何将文件从 DOS 格式转换为 UNIX 格式

正确使用printf格式参数:

while IFS=, read -r field1 field2 field3
do
printf '%sn' "UPDATE ODS.PERF_ACCT_ERR_DTL SET REC_ACTV_IND='T' WHERE BUS_DT='$field3' and ETL_ERR_CD='$field2' AND ACCT_KEY in (SELECT ACCT_KEY FROM ODS.ACCT_PORTFOLIO WHERE ACCT_SRCH_NBR='$field1');" "COMMIT;"
done < IGNORES.csv > queryfile.sql

%sn是一个格式参数 - 后续参数将根据此打印。

最新更新