从数组

时间:2016-06-30 09:35:15

标签: arrays bash awk sed whitespace

我的示例文件名为'test.in',如下所示,带有前导和尾随空格:

 Hi | hello how | are you?
 I need | to remove | leading & trailing
 spaces |  where  ever   | it's located

我需要将元素分隔为“|”在数组中以“\ n”作为主分隔符。

我希望数组中的每个元素都不应该有前导或尾随空格,只允许在字符之间使用空格。在我将代码作为主要部署之前,我正在使用示例代码来测试结果。

示例脚本的部分:

OIFS="$IFS"
IFS=$'\n'
while read LINE
do
IFS='|'
my_tmpary=($LINE)
echo ${my_tmpary[@]}
my_ary=`echo ${my_tmpary[@]} | awk '$1=$1'`
echo ${my_ary[@]}
done < test.in

我不想使用循环来清理多余的空格。 我做了试验和使用sed,awk,tr的错误方法,但它对我来说还不成功。

my_ary [@]应该是这样的

Hi hello how are you?
I need to remove leading & trailing
spaces where ever it's located

3 个答案:

答案 0 :(得分:3)

IFS是默认值时,您可以(ab)使用read将删除前导和尾随空格的事实:

while read -r line; do
  printf "%s\n" "$line" # Leading and trailing spaces are removed.
done < test.in

替代方案你可以选择这样的任务:

sed 's/^[[:space:]]*\|[[:space:]]*$//g' test.in

答案 1 :(得分:2)

sed -E 's/[\t]{1,}/ /g;s/^ *| *$//g;s/[ ]{2,}/ /g;s/ *\| */ /g;' test.in

应该这样做。所以:

$ my_ary=$(sed -E 's/[\t]{1,}/ /g;s/^ *| *$//g;s/[ ]{2,}/ /g;s/ *\| */ /g;' test.in)
$ echo "$my_ary"
Hi hello how are you?
I need to remove leading & trailing
spaces where ever it's located
This lines has many tabs

解决您的问题。

备注 1. s/[\t]{1,}/ /g将标签\t转换为空格。 2. s/^ *| *$//g删除了领先&amp;尾随空格。 3. s/[ ]{2,}/ /g将多个空格压缩为一个。 4. s/ *\| */|/g删除|周围的空格 5. -E允许使用sed扩展正则表达式。

答案 2 :(得分:1)

在AWK中:

linked list

awk '{gsub(/^ *| *$|/,"",$0); gsub(/ *\| *| +/," ",$0); print $0}' test.in 删除前导和尾随空格, gsub(/^ *| *$|/,"",$0)用一个空格替换space-pipe-space组合和多个空格, gsub(/ *\| *| +/," ",$0)打印整个记录。可以像@mona_sax一样省略$ 0,但为了清楚起见,我把它留在了代码中。

当然可以循环并且每个管道分隔的字段分别修剪:

print $0