Eu tenho file.txt que eu preciso ler em uma matriz Bash. Preciso remover espaços, aspas duplas e quase a primeira vírgula em cada entrada . Aqui está o quão longe eu cheguei:
$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"
$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
echo "|ELEMENT|$ELEMENT|"
done
$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
O que funciona muito bem, exceto pela situação de vírgula. Estou ciente de que existem várias maneiras de criar a pele desse gato, mas devido ao script maior do qual faz parte, eu realmente gostaria de usar a substituição de parâmetro para chegar até aqui:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
Isso é possível através da substituição de parâmetros?
awk
oused
processar o dado?Respostas:
Eu removeria o que você precisa remover
sed
antes de carregar na matriz (observe também os nomes das variáveis em minúsculas, em geral é melhor evitar variáveis em maiúsculas nos scripts de shell):Isso produz a seguinte saída no seu arquivo de exemplo:
Se você realmente deve usar a substituição de parâmetro, tente algo como isto:
fonte
RANDOMTEXTTHATWILLNEVERBEINTHEFILE
.Tanto quanto posso ver, não há necessidade de lê-lo em uma
bash
matriz para criar essa saída:A
sed
expressão exclui espaços e aspas duplas, substitui a primeira vírgula por um espaço (não há outros espaços na cadeia neste momento), exclui todas as outras vírgulas, restaura a primeira vírgula e precede e acrescenta os dados extras.Como alternativa, com o GNU
sed
:(o padrão
sed
não suporta a combinação de2
eg
como sinalizadores nos
comando).fonte
's/,//2g
para remover vírgulas, começando com o 2ºs/.*/|ELEMENT|&|/
mas isso pode ser mais esforço para sed.Saia do hábito de usar nomes de variáveis ALLCAPS. Você acabará colidindo com uma variável "sistema" crucial como PATH e quebrará seu código.
fonte
PATH=something; ls $PATH
e depois me perguntei sobre ols: command not found
erro.[Esta é essencialmente uma versão mais desenvolvida da resposta de glenn jackmann ]
Construindo uma matriz associativa a partir da chave e do valor retirados, usando a primeira vírgula como separador:
fonte
Você pode fazer um loop sobre a matriz e usar uma variável intermediária:
Isso atribui à
rest
parte após a primeira vírgula; concatenamos três partes novamente na variável original:rest
de cada vírgula com nadafonte