在我的shell脚本中,我想逐行读取 csv 文件,并从其中一列中删除前缀和后缀。
这是示例 input.csv :
192.168.0.1, user1, "2zG7CBKp5d4z"
192.168.0.2, user2, "9vy6J,M2A3b6"
192.168.0.3, user3, "V5q,8mvz#$ac"
这是我的代码:
#!/bin/bash
filename="$1"
while IFS="," read f1 f2 f3
do
f3="${f3#\"}"
f3="${f3%\"}"
echo "$f1" "$f2" "$f3"
done <"$filename"
在带有while
的脚本中,我想ssh
用用户($f1
)和密码($f2
)托管($f3
),但是具有从f3
中删除双引号。 ssh
部分将在以后实现。删除前缀可以按预期工作,但后缀则不能。
有人可以告诉我为什么吗?
答案 0 :(得分:1)
删除尾随"
对我来说很有效。我怀疑您的行(因此f3
)不是以"
结尾,而是以\r
结尾-Windows换行符(\r\n
)的第一部分,与unix相反换行符(\n
)。
使用dos2unix original
或tr -d \\r < original > converted
转换文件。
顺便说一句,仅正确读取了最后一个字段,因为它是最后一个。通常,read
会将最后一个字段内的逗号解释为新字段的开头– read
并没有为引号赋予特殊含义。但是,read
会将所有剩余字段读入给定的最后一个变量,在这种情况下为f3
。
答案 1 :(得分:0)
如果最后一个字段的长度恒定,则cut
会有效地消除引号:
rev input.csv | cut -c2-13,15- | rev
如果 all 字段长度恒定,则不需要rev
:
cut -c-20,22-33 input.csv