后缀删除在Shell脚本中不起作用

时间:2019-06-07 09:43:38

标签: bash shell

在我的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部分将在以后实现。删除前缀可以按预期工作,但后缀则不能。 有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:1)

删除尾随"对我来说很有效。我怀疑您的行(因此f3)不是以"结尾,而是以\r结尾-Windows换行符(\r\n)的第一部分,与unix相反换行符(\n)。

使用dos2unix originaltr -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