如何正确读取文件行到数组?

时间:2010-11-21 16:33:05

标签: linux bash scripting curl sed

我有一个这样的文件:

1234 1234 "First Name" "Last Name"

我有一个像这样的bash函数:

function somePeoples()
{
  body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
  echo $body
}

哪个包含在我将在命令行中提供的bash脚本中。之后,我会执行以下操作来测试函数:

$ arr=(1234 1234 "First Name" "Last Name")
$ somePeoples "{arr[@]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"
$ somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"

现在让我们回到包含这样的行的文件:

input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"

我尝试通过有限数量的for循环读取文件中的每一行,因为我确切地知道文件中有多少行。诀窍是读取每一行并将每一行放入一个数组中以传递给somePeoples函数。所以我创建了一个脚本,用该函数来源其他脚本。让我们把它称为客户端脚本,让我们假装它实际上是循环的:

the client script:
arr=(`sed -n "1p" input.txt`)
somePeoples "${arr[@]}"

但令我恐惧的是输出:

$ "id":"1234","num":"1234","name":""First,"lname":"Name""

此外,尝试这样做会产生相同的结果

somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
somePeoples `sed -n "1p" input.txt`

有什么区别?当我在命令行输入相同的引用模式时,它可以正常工作,但是当我从文件读取输入并将其传递给某个数组或直接传递给该函数时。即使引用了参数,为什么它会在空格上打破?而且,错误,我该如何防止这种情况发生?

我实际上是在尝试准备一个以jSON格式传递给cURL的请求体,输入参数包含在数百行的文件中。但是我觉得cURL的东西与这个问题无关,因为我只通过bash重现了这个问题。

3 个答案:

答案 0 :(得分:1)

这并没有真正解决为什么引用不起作用的问题(我假设您尝试使用单引号),但如果可以接受快速而肮脏的解决方案,则可以通过regexp将空格转换为其他内容,并且在需要时回到空间

答案 1 :(得分:1)

正如您所说,如果原始数据文件是CSV格式,那么您最好做一些简单的事情,比如

IFS=, while read id num name lname; do
    ...
done <input.txt

答案 2 :(得分:0)

好的,这就是我将输入文件转换为csv后所做的事情:

ORIG_IFS=$IFS
IFS=$(echo -en ",")
arr=(`sed -ns "1p" input.txt`) # nvm the extension
IFS=$ORIG_IFS
somePeoples "${arr[@]}"

这会产生输出:

"id":"1234","num":"1234","name":""First Name"","lname":""Last Name""

引用的字符串被双引号引用。几乎接近。也许我需要先清理输入文件?

sed -e 's/"//g' < input.txt > input.txt.new

然后就是我用来最终得到我想要的输出。谢谢你们:)直到现在才知道IFS。

相关问题