2013-03-17 59 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