我的示例文件名为'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
答案 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