从bash中的echo输出中省略逗号

时间:2014-01-20 15:42:22

标签: bash csv echo

您好我正在从.csv文件中读取并使用

echo $line

将该记录的单元格内容打印到屏幕上,但也会打印逗号,即

1,2,3,a,b,c

我真正想要的地方

1 2 3 a b c

检查echo手册页没有省略逗号的选项,所以有没有人有一个漂亮的bash技巧来做到这一点?

3 个答案:

答案 0 :(得分:3)

使用bash替换:

$ echo "${line//,/ }"
1 2 3 a b c

请注意双斜线的重要性:

$ echo "${line/,/ }"
1 2,3,a,b,c

也就是说,单一的只会替换第一次出现。


为了完整性,请检查其他方法:

$ sed 's/,/ /g' <<< "$line"
1 2 3 a b c

$ tr ',' ' ' <<< "$line"
1 2 3 a b c

$ awk '{gsub(",", " ")}1' <<< "$line"
1 2 3 a b c

答案 1 :(得分:1)

如果由于可移植性问题需要更符合POSIX标准的内容,echo "$line" | tr ',' ' '也适用。

答案 2 :(得分:0)

如果必须将字段值用作分隔值,则可以使用 IFS 内置bash变量。 您可以使用“,”值设置它,以指定用于从.csv文件读取的读取命令的字段分隔符。

ORIG_IFS="$IFS"
IFS=","
while read f1 f2 f3 f4 f5 f6
do
        echo "Follow fields of record as separated variables"
        echo "f1: $f1"
        echo "f2: $f2"
        echo "f3: $f3"
        echo "f4: $f4"
        echo "f5: $f5"
        echo "f6: $f6"
done < test.csv
IFS="$OLDIFS"

通过这种方式,您可以为行/记录的每个字段添加一个变量,您可以根据需要使用它。

注意:以避免意外行为,请记住将原始值设置为IFS变量