2013-03-17 55 views
2

我正在使用bash腳本(Ubuntu 12.10)從文本文件處理一些數據。連接grep輸出字符串(bash腳本)

基本思想是,我使用grep從文件中選擇某一行。接下來,我處理該行以獲取sed的編號。 grep和sed命令都在工作。我可以回顯數字。

但是,結果與字符串的連接出錯了。

當我從變量或文件執行grep命令時,在組合字符串時得到不同的結果。當我grep一個文件時,連接出錯。當我使用與文件中相同的文本對變量進行grep操作時,它的工作方式與預期的一樣。

我在做什麼錯了從文件的grep?

test.pdb內容

REMARK overall = 324.88 
REMARK bon  = 24.1918 
REMARK coup = 0 

我的腳本

#!/bin/bash 

#Correct function 
echo "Working code" 
TEXT="REMARK overall = 324.88\nREMARK bon  = 24.1918\nREMARK coup = 0\n" 
DATA=$(echo -e $TEXT | grep 'overall' | sed -n -e "s/^.*= //p") 

echo "Data: $DATA" 
DATA="$DATA;0" 
echo $DATA 


#Not working 
echo "" 
echo "Not working code" 
DATA=$(grep 'overall' test.pdb | sed -n -e "s/^.*= //p") 

echo "Data: $DATA" 
DATA="$DATA;0" 
echo $DATA 

輸出

Working code 
Data: 324.88 
324.88;0 

Not working code 
Data: 324.88 
;04.88 
+1

使用更多引號!請參閱http://mywiki.wooledge.org/Quotes和http://wiki.bash-hackers.org/syntax/words – 2013-03-17 15:41:43

回答

0

我瘋狂了同樣的問題。

真正的問題是您的「test.pdb」可能有錯誤的EOL(行尾)字符。

Linux的EOL:LF(又名\ n)的

的Windows EOL:CR LF(又名\ r \ n)的

這是不是意味着回波和grep將與這個額外的人品問題(\ r)幸運的是,tr,sed和awk正確地管理它。

所以,你也可以嘗試用:

DATA = $(grep的 '整體' test.pdb | sed的-n -e 「S /^.*= // P」 | sed的-e 2S/\ R $ //「)

DATA = $(grep的 '整體' test.pdb | SED -n -e 」S /^.*= // p「 的| TR -d「\ r ')

0

試試這個:

SUFFIX=";0" 
DATA="${DATA}${SUFFIX}" 
+0

這適用於普通字符串,但不適用於輸出grep/sed命令,我不知道爲什麼, – jensG 2013-03-17 17:36:34

0

隨着,這將是更可靠和更清潔的我想:

$ awk '$2=="overall"{print "Working code\nData: " $4 "\n" $4 ";0"}' file.txt 
Working code 
Data: 324.88 
324.88;0 
+0

這是一種更簡單的方法,但是我的命令與grep命令「Working code Data:324.88 ; 04.88」相同。連接發生在開始,而不是結束。 – jensG 2013-03-17 17:46:41

+0

這並沒有解決問題,但它幫助了我很多。顯然這個問題對我的電腦來說是本地的。 – jensG 2013-03-24 17:20:04