【问题标题】:reading strings containing backslashes into variables in bash将包含反斜杠的字符串读入bash中的变量
【发布时间】: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?。但我仍然认为这不是一个好主意。

标签: bash sed awk


【解决方案1】:

使用read-r 选项:

while read -r auser apass;

如果给出-r\ 将不会被视为转义字符。

【讨论】:

  • 这绝对是的答案。 (实际上,read 应始终与 -r 选项一起使用,除非您知道自己在做什么)。
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 2018-01-29
  • 2015-03-26
相关资源
最近更新 更多