2015-11-07 71 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"