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

时间:2015-11-07 18:43:55

标签: string bash sed

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

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替换命令:

sed 's/$/`echo "$STR"`/g' inputfile > outputfile

但继续获取变量名而不是变量值:

示例输出:

1000056|$"STR"  
1000057|$"STR"  
...  

期望的输出:

1000056|Closed With Notification  
1000057|Closed With Notification  

我做错了什么?谢谢,维克

2 个答案:

答案 0 :(得分:2)

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

然后你需要使用上面列表中缺少的这个组合:

sed "s/$/| $a/g"  $DATAFILE > datfile99

问题在于命令周围的单引号会阻止变量$ a的插值。

如果用双引号括起命令,整个字符串将被传递到 sed 之后,shell将$ a替换为其当前值。

答案 1 :(得分:1)

尝试将'替换为",这将告诉您的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"