我正在编写脚本来处理入站数据文件。入站文件名都遵循相同的模式:
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
我做错了什么?谢谢,维克
答案 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"