【问题标题】:How do I properly read a line of a file into an array?如何正确地将文件的一行读入数组?
【发布时间】:2011-05-13 10:34:09
【问题描述】:

我有一个这样的文件:

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 重现了这个问题。

【问题讨论】:

    标签: linux bash scripting curl sed


    【解决方案1】:

    好的,这是我将输入文件转换为 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。

    【讨论】:

    • 没有理由使用echo 来设置IFS,只需使用IFS=,IFS=','
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 其实我觉得我搞错了。原始输入文件是一个 csv 文件,每列都有引用值。我将逗号正则表达式转换为空格,但是,我失败了。谢谢你的建议。我认为空格不是这个问题的正确分隔符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多