exemplo a seguir:
string=" 'f o o' 'f oo' 'fo o' "
array=($string)
echo "${array[0]}"
saídas:
'f
enquanto a saída esperada é:
'f o o'
A única solução que encontrei foi alterar o delimitador para nova linha (em vez de espaço):
IFS=$'\n'
string="'f o o' # 'f oo' # 'fo o' #"
array=($(echo "$string" | tr '#' '\n'))
echo "${array[0]}"
saídas:
'f o o'
que produz o resultado esperado, no entanto, isso requer definir um delimitador personalizado em string e invocará um novo subprocesso em cada chamada. Gostaria de ver uma solução melhor do que essa, obrigado!
Editar:
A string de exemplo acima deve ser suficiente, mas como alguns perguntaram como é o conteúdo do arquivo, é algo parecido com isto:
'magic1' 'some text' 'another simple text' 'some t£xt'
'magic2' 'another line with simple text' 'foo bar' 'yeah another substring'
'magic3' 'so@m{e$%& te+=*&' 'another substring' 'here is the substring'
'magic4' 'why not another line !' 'yeah I like that' 'the substring yeah !!!'
Ainda mais detalhes (como alguns usuários solicitaram): há uma função personalizada que grep
retorna a linha do arquivo acima usando um substring
.
por exemplo, minha função find é semelhante a esta:
_find()
{
string="$(grep "$1" "$file")"
}
então eu chamo assim:
_find "magic2"
echo "$string"
que produz:
'magic2' 'another line with simple text' 'foo bar' 'yeah another substring'
P/S: cada substring é delimitada por espaço, e cada substring é citada entre aspas simples. _find
Não é possível editá-la, pois ela é usada por outras funções. Veja os comentários para mais informações.