使用 sed 在文件中的每一行末尾附加字符串会导致未引用的换行符错误

Append string at the end of each line in a file with sed causes unquoted newline error

我试图在使用 psql 加载到 Postgres 之前将 job_id 字段附加到 CSV 文件。这应在 Python 脚本中执行。

cmd = f""" \
psql {con} -c "\COPY raw.{tablename} FROM PROGRAM 'sed ''s/.*/&,\"{job_id}\"/'' /airflow/stage/test-{job_id}/{filename}' HEADER CSV"
"""

result = subprocess.run(cmd, shell=True, executable='/bin/bash', stderr=subprocess.PIPE)

以上导致了以下记录错误。

[2021-06-27 00:35:08,527] {logging_mixin.py:104} INFO -         psql postgres://user:password@10.0.0.15:5432/test -c "\COPY raw.testdata FROM PROGRAM 'sed ''s/.*/&,"20210626T155818"/'' /airflow/stage/test-20210626T155818/testdata.csv' HEADER CSV"
[2021-06-27 00:35:08,568] {logging_mixin.py:104} INFO - ERROR:  unquoted newline found in data
HINT:  Use quoted CSV field to represent newline.

没有上面的字符串附加操作加载文件会成功。在不影响换行符的情况下将字符串附加到每一行的正确方法是什么?

您的输入文件使用 DOS 行结束约定,如果每行结尾有 cr-lf 对。 \COPY 只要一致就处理这个罚款,但 sed 不处理。它会转换您的文件,以便 job_id 插入 crlf 之间。