关于字符串:从LinuxBash中Windows中形成的文本文件中读取内容

Read content from text file formed in Windows in Linux bash

本问题已经有最佳答案,请猛点这里访问。

我正在尝试使用wget和url从数据库下载文件。例如。

wget"http://www.rcsb.org/pdb/files/1bxs.pdb"

因此,URL的格式如下:http://www.rcsb.org/pdb/files/($idnumber.pdb"

但是我有很多文件要下载;所以我编写了一个bash脚本,它从文本文件中读取ID_号,形成URL字符串,并由wget下载。

1
2
3
4
5
6
7
8
!/bin/bash

while read line
do
url="http://www.rcsb.org/pdb/files/$line.pdb"
echo -e $url
wget $url
done < id_numbers.txt

但是,URL字符串的格式为

1
.pdb://www.rcsb.org/pdb/files/4H80

因此,用http代替.pdb。我不明白为什么。有人有主意吗?如何格式化,这样URL就是

1
"http://www.rcsb.org/pdb/files/($idnumber).pdb"

?谢谢。

注意事项。这个问题被标记为"如何在bash中连接字符串?"的副本。但我实际上是在要求别的东西。我在问这个问题之前读了这个问题,结果发现我的问题是在Windows中准备TXT文件,而不是真正的字符串概念。我编辑了问题标题。我希望现在更清楚了。


听起来您的id_numbers.txt文件有DOS/Windows样式的行尾(回车后跟换行符),而不是普通的Unix行尾(仅换行符)。其结果是,read认为该行以回车结束,$line实际上在末尾有回车,嵌入到url中,造成了各种混乱。

有几种方法可以解决这个问题。使用变量时,可以让bash从变量中修剪回车:

1
2
url="http://www.rcsb.org/pdb/files/${line%$'
'}.pdb"

或者你可以让read通过告诉它回车等于空白(read将从它所读的内容中删除前导和尾随空白)来修剪它:

1
2
while IFS=$'
'
read line

或者,您可以使用dos2unix之类的命令(或操作系统上的等效命令)来转换id_numbers.txt文件。


-eecho选项用于在不插入新行的情况下输出所需的内容,您在此处不需要它。

我还怀疑您的文件中包含的ID格式不正确,您是在哪个操作系统上创建的?

无论如何,您可以通过以下方式简化脚本:

1
2
3
4
5
6
!/bin/bash

while read line
do
    wget"http://www.rcsb.org/pdb/files/$line.pdb"
done < id_numbers.txt

我能用这样生成的id_numbers.txt文件成功地测试它:

1
for i in $(0 9) ; do echo"$i">> id_numbers.txt ; done


试试这个:

1
2
url="http://www.rcsb.org/pdb/files/"$line
$url=$url".pdb"

有关详细信息,请检查如何在bash中连接字符串变量?