2012-12-21 38 views
1

我编写了一个shell脚本来使用grep解析某个文件,并在后续命令中使用结果。shell脚本变量中的奇怪行为

源代码的相关部分是

VERSION=`grep "^Stable tag:" readme.md | awk -F' ' '{print $NF}'` 
echo $VERSION 
echo "Readme file version is $VERSION is it correct" 

在readme.md文件相关线上

Stable tag: 2.2.2 

您所期望的输出

2.2.2 
Readme file version is 2.2.2 is it correct 

但我得到以下作为输出

2.2.2 
is it correctrsion is 2.2.2 

我很确定在我的文本文件的行尾没有(不可打印或非ascii)字符。我通过在vim中启用:set invlist命令来检查它。

任何想法为什么它会发生这样的事情?或者任何其他想法来调试这个问题?

+2

您可以单独使用awk而不使用grep:'awk -F'''/ ^稳定标记:/ {print $ NF}'readme.md' – aragaer

+0

@aragaer谢谢。不知道我可以这样使用'awk'。现在我还必须包含'tr'(请参见下面的答案),你认为我仍然可以单独使用'awk'吗? – Sudar

+0

'人awk',我在那里看到'sub'。可能像'awk -F'''/^Stable tag:/ {sub(“\ r”,“”,$ NF); print $ NF}'readme.md',尽管我已经在那个时候考虑过sed了。 – aragaer

回答

3

这看起来像一个DOS编辑的文件,你在Unix系统上工作。剥去回车(Ctrl-M)。

你可以使用tr(1),以消除那些:

VERSION=`grep "^Stable tag:" readme.md | tr -d '\015' | awk -F' ' '{print $NF}'` 

awk中可能也有一些内置的功能,在这些工作,但我不知道足够的awk此。

+0

任何想法如何将它从shell脚本变量中删除? – Sudar

+0

@Sudar你可以使用'tr'。看我的编辑。 – kmkaplan

+0

谢谢。这似乎是问题。当我在vim中启用隐藏字符时,奇怪的这个角色没有出现。 – Sudar