修剪bash中的string中的新行字符

我正在从Excel导出的.csv文件中提取数据。

csv文件看起来像这样:

Category,Feature,Description,app1,app2,app3,app4,app5,app6,app7 Employee Relations,Employee Management,,y,y,n,y,y,y,n Employee Relations,Employee Availability,,y,y,n,n,y,y,n 

问题是结束字符换行正在进行中。 采取以下代码:

 title=$(head -n 1 $1) # grab the first row title=`echo $title | sed -e 's/^ *//' -e 's/ *$//'` # me trying to fix. I think this is the issue echo $title #this seems to look right IFS=',' read -a titline <<<"$title" # make it an array for (( i = 0 ; i < ${#titline[@]} ; i++ )) do echo "[[${titline[$i]}]]" done 

打印出来:

 Category,Feature,Description,app1,app2,app3,app4,app5,app6,app7 [[Category]] [[Feature]] [[Description]] [[app1]] [[app2]] [[app3]] [[app4]] [[app5]] [[app6]] ]]app7 

你可以看到最后一行应该是:

 [[app7]] 

这是与脚本的其余部分搞砸了。
我不知道我在做什么错误,并可以使用一个指针

问题是你的csv文件有DOS行结尾。

我复制并粘贴你的数据和你的脚本,它会产生输出:

 Category,Feature,Description,app1,app2,app3,app4,app5,app6,app7 [[Category]] [[Feature]] [[Description]] [[app1]] [[app2]] [[app3]] [[app4]] [[app5]] [[app6]] [[app7]] 

然后,我将csv文件转换为DOS行尾,并得到了与您所看到的相同的问题。

解决的办法是使用dos2unix或类似的工具来修复文件,然后再读取它。 这可以如下完成:

 title=$(dos2unix <"$1" | head -n 1) # grab the first row echo $title IFS=',' read -a titline <<<"$title" # make it an array for (( i = 0 ; i < ${#titline[@]} ; i++ )) do echo "[[${titline[$i]}]]" done 

或者,你可以使用sed

 title=$(head -n 1 "$1" | sed 's/\r//') # grab the first row echo $title IFS=',' read -a titline <<<"$title" # make it an array for (( i = 0 ; i < ${#titline[@]} ; i++ )) do echo "[[${titline[$i]}]]" done