我正在使用bash脚本(Ubuntu 12.10)处理文本文件中的一些数据。
基本思路是我使用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
答案 0 :(得分:1)
我对同样的问题感到疯狂。
真正的问题是你的“test.pdb”可能有一个错误的EOL(行尾)字符。
Linux EOL:LF(又名\ n)
Windows EOL:CR LF(又名\ r \ n)
这意味着echo和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')
答案 1 :(得分:0)
试试这个:
SUFFIX=";0"
DATA="${DATA}${SUFFIX}"
答案 2 :(得分:0)
使用awk,我想它会更可靠,更清洁:
$ awk '$2=="overall"{print "Working code\nData: " $4 "\n" $4 ";0"}' file.txt
Working code
Data: 324.88
324.88;0