【发布时间】:2012-12-31 17:42:21
【问题描述】:
好的,所以我有一个用户和密码的 CSV 文件,密码有时包含反斜杠,我需要遍历这个文件并将用户和密码传递给另一个脚本,但我不知道如何制作 bash将反斜杠作为文字字符。
csv:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv
user3@domain.com,bzfbx6bkuu\Mpull
user2@domain.com,Hppk8mll\kffbsfd
user1@domain.com,w1fgfqbjlhLjnni\
Sed 没有扩展反斜杠 - 这很好:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/"
user3@domain.com bzfbx6bkuu\Mpull
user2@domain.com Hppk8mll\kffbsfd
user1@domain.com w1fgfqbjlhLjnni\
尝试将它们读入变量会导致反斜杠成为元字符,如您所见,它会转义字符并导致最后一行转义返回字符,因为它位于末尾:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/" | while read user pass; do echo "${user},${pass}"; done
user3@domain.com,bzfbx6bkuuMpull
user2@domain.com,Hppk8mllkffbsfd
尝试先转义反斜杠也不起作用:
jgalley@debian1mig:~/logs/zimbraShares$ cat test.csv | sed "s/,/\t/" | sed "s/\\\/\\\\/g" | while read user pass; do echo "${user},${pass}"; done
user3@domain.com,bzfbx6bkuuMpull
user2@domain.com,Hppk8mllkffbsfd
jgalley@hoth1mig:~/logs/zimbraShares$
最终目标是这样的:
head test.csv | sed "s/,/\t/g" | while read auser apass;
do
echo -n "${auser},${apass}"
bash -c "/home/jgalley/scripts/someScript.php -u '${auser}' -p '${apass}' -d '${auser}'";
done
【问题讨论】:
-
当密码中包含逗号时你会怎么做?在 bash 中解析 CSV 很困难。我建议使用具有proper CSV parsing library 的语言来执行此操作
-
密码字段不包含逗号。反斜杠是唯一给我带来麻烦的字符。
-
你可以通过设置
IFS=,来避免sed并大大简化事情。见How to have bash parse a CSV file?。但我仍然认为这不是一个好主意。