2015-11-07 73 views
2

我正在写一个脚本来处理入站数据文件。入站文件名都遵循相同的模式:bash的字符串操作 - 显示值,而不是变量名

word1_word2_word3_YYYYMMDD.txt 

我的脚本需要入站文件的名称,剔除扩展名,剔除日期,替换所有下划线用空格和生成的字符串追加到每行在原始文件中。我可以成功创建所需的字符串并将其分配给变量“STR”

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

casenumber1"|"word1 word2 word3 
casenumber2"|"word1 word2 word3 
casenumber3"|"word1 word2 word3 

我的问题是,我的生活,我不能让庆典,以显示该变量的值,它总是显示变量名。

这是我用它来创建从文件名需要的串线:

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

某处是,我怀疑,一个很简单的问题。你能把它修剪一下吗?例如,第一段完全没有必要。 – chepner

+2

要添加到@ chepner的评论:如果您将其简化为一个简洁的问题描述,有代表性的样本输入和期望的输出,人们更有可能帮助您。请参阅[MCVE(最小,完整和可验证的示例)](http://stackoverflow.com/help/mcve) – mklement0

+0

,并考虑编辑您的Q以包括一小组样本输入数据和所需格式作为输出相同的输入)。这样做可以节省您的段落描述。祝你好运。 – shellter

回答

2

你的问题的要点是,你需要一个字符串添加到使用SED和该字符串的值包含在一个变量,你所说的“一个”文件,因为我们在最后读名单。

然后,你需要使用这个组合,这是从你的列表中缺少以上:

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

的问题是,在你的命令中的单引号防止变量$ a的插值。

如果包裹在双引号将整个字符串将被传递到命令的sed后壳更换$ a的当前值。

+0

很好解释;可能值得补充的是,通常在双引号外壳字符串中应该使用'\ $'来安全地保留'$'作为文字传递给目标命令;在这种情况下,它并不是必需的,因为'$'后面跟着'/',它不能被误认为变量引用,但在其他情况下可能会引用。 – mklement0

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"