如何在sed中正确逃脱报价?

时间:2013-04-04 21:00:33

标签: bash sed

我有一个CSV,其中值以分号分隔。 我需要将该CSV中的数据传输到MongoDB数据库中的现有集合,这在此问题上实际上是无关的。

为了方便起见,我将使用该CSV中的一个示例行:

echo '1243;firstName' | sed "s:\([0-9]*\)\;\(.*\):mongo localhost/test --eval \\\\'db.test.update({_id\: \1}, {name\: \"\2\"})\\\\':" | xargs -I {} sh -c "{}"

MongoDB shell version: 2.2.0
connecting to: localhost/test
Thu Apr  4 22:50:10 ReferenceError: firstName is not defined (shell eval):1

问题是,当查询到达MongoDB解释器时,它没有转义。

我已经尝试在每个引号前添加最多3个反斜杠,但没有任何改变。我应该如何正确地转义引号,以便它们保持在那里直到查询到达MongoDB解释器?

1 个答案:

答案 0 :(得分:2)

直接拨打mongo比尝试将所有引用恰到好处传递给xargs要简单得多:

while IFS=';' read id firstName; do
    mongo localhost/test \
      --eval "db.test.update({_id: $id}, {name: \"$firstName\"})"
done < file.csv