String bash字符串操作-显示值,而不是变量名

String bash字符串操作-显示值,而不是变量名,string,bash,sed,String,Bash,Sed,我正在编写一个脚本来处理入站数据文件。入站文件名都遵循相同的模式: word1_word2_word3_YYYYMMDD.txt 我的脚本采用入站文件的名称,去掉文件扩展名,去掉日期,用空格替换所有下划线,并将结果字符串追加到原始文件的每一行。我可以成功地创建所需的字符串并将其分配给变量“STR” 最后一步是将$STR的值附加到文件中的每一行,以便文件中的数据行最终看起来如下所示: casenumber1"|"word1 word2 word3 casenumber2"|"word1 wo

我正在编写一个脚本来处理入站数据文件。入站文件名都遵循相同的模式:

word1_word2_word3_YYYYMMDD.txt
我的脚本采用入站文件的名称,去掉文件扩展名,去掉日期,用空格替换所有下划线,并将结果字符串追加到原始文件的每一行。我可以成功地创建所需的字符串并将其分配给变量“STR”

最后一步是将$STR的值附加到文件中的每一行,以便文件中的数据行最终看起来如下所示:

casenumber1"|"word1 word2 word3  
casenumber2"|"word1 word2 word3  
casenumber3"|"word1 word2 word3
我的问题是,我无法让bash显示变量值,它总是显示变量名

这是我用来从文件名创建所需字符串的行:

STR=`echo $DATAFILENAME | cut -d '.' -f 1 | sed 's/[0-9]*//g'|sed 's/_/ /g' | sed  's/[[:blank:]]*$//'`
我尝试使用一个典型的sed replace命令:

sed 's/$/`echo "$STR"`/g' inputfile > outputfile
但请继续获取变量名而不是变量值:

示例输出:

1000056|$"STR"  
1000057|$"STR"  
...  
期望输出:

1000056|Closed With Notification  
1000057|Closed With Notification  

我做错了什么?谢谢,Vic

您问题的要点是,您需要使用sed向文件中添加一个字符串,该字符串的值包含在一个变量中,您称之为“a”,正如我们在最终列表中看到的那样

然后您需要使用上述列表中缺少的组合:

sed "s/$/| $a/g"  $DATAFILE > datfile99
问题是命令周围的单引号阻止了变量$a的插值


如果将命令用双引号括起来,则在shell将$a替换为其当前值后,整个字符串将传递给sed

尝试用
替换
,这将告诉shell替换任何shell变量

sed-i“s/$/
echo$STR
/g”

注意
-i
选项将对文件进行实际更改,因此备份是明智的

编辑:而不是使用此

STR=`echo $DATAFILENAME | cut -d '.' -f 1 | sed 's/[0-9]*//g'|sed 's/_/ /g' | sed  's/[[:blank:]]*$//'`
你可以试试这个

sed -i -r "s/(.*)[.][a-zA-Z]+$/\\1/g;s/[._]/ /g" <<< "$DATAFILENAME"

sed-i-r“s/(.*)[.][a-zA-Z]+$/\\1/g;s/[.\u]//g“我猜想,这篇文章的某个地方是一个相当简单的问题。你能把它修小一点吗?例如,第一段完全没有必要。在@chepner的评论中补充一句:如果你把它简化为一个简洁的问题描述,有代表性的样本输入和期望的输出,人们更可能帮助你。请参阅并考虑编辑您的Q,包括小样本输入数据集,以及所需的格式作为输出(来自同一输入)。这样做将为您保存描述的段落。祝你好运。谢谢你的反馈。会的。加上uno可以改进你的问题。解释得很好;值得一提的是,通常,
\$
应该在双引号shell字符串中使用,以安全地将
$
作为传递给目标命令的文本保存;在本例中,它恰好不需要,因为
$
后面紧跟着
/
,这不能被误认为是变量引用,但在其他情况下可能会被误认为是变量引用。