BASH удалить начальные и конечные пробелы в массиве - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть данные, поступающие с mysql, и некоторые значения имеют начальные или конечные пробелы.

У меня есть такой код:

IFS=$':' res=(${vals//$'\t'/:}) 

for (( i=0 ; i<${#res[@]} ; i++ )); do
    echo "$i: ${res[i]}*"
done

есть простой эффективный способ чтобы гарантировать отсутствие начального или конечного пробела в res[i]?

Спасибо

EDIT Это результат моего запроса MYSQL до его прохождения через IFS.

ZnbMF0 9RrO7 1 SiteA password password 12 1234 1234 456 456 0 0 0 0 0 0 0 0 test@domain.com test user 5 2222 0 0 0 0 server address 0 0 test@domain.com 0 0 0 0 0 0 0 0 0 0 0 0 0 NULL

В MySQL адреса электронной почты имеют начальные и конечные пробелы. Обработка через IFS, а затем зацикливание, например:

for (( i=0 ; i<${#res[@]} ; i++ )); do
    echo "$i: ${res[i]}*"
done

Результат:

0: ZnbMFO*
1: 9RrO7*
2: 1*
3: SiteA*
4: password*
5: password*
6: 12*
7: 1234*
8: 1234*
9: 456*
10: 456*
11: 0*
12: 0*
13: 0*
14: 0*
15: 0 *
16: 0*
17: 0*
18: 0*
19: test@domain.com *
20: test*
21: user*
22:  5*
23:  2222 *
24: 0*
25: 0 *
26: 0*
27: 0*
28: server*
29: address*
30: 0*
31: 0*
32:  test@domain.com *
33: 0*
34: 0*
35: 0*
36: 0*
37: 0*
38: 0*
39: 0 *
40: 0*
41:  0*
42: 0*
43: 0 *
44: 0*
45: 0*
46: NULL*

* предназначен только для выделения завершающего пробела.

Спасибо

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Допустим, у вас есть такой массив:

arr=('foo bar' 'test@domain.com ' ' test@domain.com ' ' test@domain.com')

Для проверки содержимого массива используйте printf:

printf '[%s]\n' "${arr[@]}"

Это покажет:

[foo bar]
[test@domain.com ]
[ test@domain.com ]
[  test@domain.com]

Теперь для удаления начального и конечного пробелов:

arr=("${arr[@]/#[[:blank:]]/}")    # remove leading space/tab from each element
arr=("${arr[@]/%[[:blank:]]/}")    # remove trailing space/tab from each element

Теперь, если вы снова напечатаете массив:

printf '[%s]\n' "${arr[@]}"

Будет показано:

[foo bar]
[test@domain.com]
[test@domain.com]
[test@domain.com]
0 голосов
/ 07 апреля 2020

Не уверен, что вы бы назвали это простым, но вы можете использовать sed:

echo "${res[i]}" | sed 's/^ *\| *$//g'

vals=$' a \t c d'
IFS=$':' res=(${vals//$'\t'/:})

for (( i=0 ; i<${#res[@]} ; i++ )); do
    echo X${res[i]}X
    res[$i]=$(echo "${res[i]}" | sed 's/^ *\| *$//g')
    echo X${res[i]}X
done

Вывод:

X a X
XaX
X c dX
Xc dX
...