como armazenar a saída de um comando na matriz com cada valor em uma aspa dupla

1

Eu quero armazenar cada saída em valores de matriz com aspas duplas. valores podem ter espaço também.

FOUNDFILES=($(locate --database ~/.locate.db -i -b "$INPUT"))

se a entrada para o comando locate for muito muito recente (onde muito mais recente é o nome do arquivo). deve ser armazenado como "muito muito mais recente". Localize também localiza outros arquivos com a palavra muito neles. então, se houver algum outro arquivo como heisvery, ele também deve ser armazenado como "heisvery", onde "very very latest" é o 0º valor e "heisvery" é o valor 1 do array.

    
por jeevanreddymandali 13.07.2015 / 15:57

2 respostas

4

Seria uma situação rara, na verdade, onde você realmente precisa armazenar uma string (em uma variável) junto com o início e o final aspas que não fazem parte dos dados. É tipicamente melhor para pós-processo.

var='two  spaces'
printf '# "%s"\n'  "$var"
# "two  spaces"

ary=( 'two  spaces' '$USER' ) 
printf '# "%s"\n'  "${ary[@]}"
# "two  spaces"
# "$USER"

Como locate envia caminhos totalmente qualificados ,
e a opção -b significa pesquisar somente o nome de uma b , e você quer que somente o nome da base seja capturado,
então você pode usar sed para remover a porção /pa/th/ .

Como você deseja procurar por "muito muito mais recente" como o nome de base completo ,
e você também quer procurar "very" em qualquer lugar no basename,
então você realmente precisa usar uma pesquisa expressão regular .

  • -r Pesquisa por um regexp básico
  • --regex Procura por um regexp estendido (usado no exemplo abaixo)

Para fazer seu array capturar linhas inteiras, é necessário alterar o I nternal F campo S eparator (IFS) para \n apenas.

Observe que os itens da matriz são capturados / armazenados conforme são encontrados na saída locate's . Para organizá-los na mesma ordem que a matriz input , algum processamento adicional da matriz é necessário (via para..grep..loop..awk abaixo).

input=( '^very very latest$' 'very' )
IFS=$'\n'; foundfiles=($(locate -i -b --regex "${input[@]}" | sed 's|.*/||'))
foundfiles=($(for((i=0;i<${#input[@]};i++))
              do printf '%s\n' "${foundfiles[@]}" | grep -E "${input[i]}"
              done | awk '!seen[$0]++'))
printf '%s\n' "${foundfiles[@]}"

output - mostra o array completo, que é o índice [0] e [1]:

very very latest
heisvery

Se você quiser a saída printf entre aspas, basta alterar a última linha para printf '"%s"\n' "${foundfiles[@]}"

... ou se você ainda precisar adicionar as aspas ao próprio array, adicione as duas linhas seguintes após o for..grep..loop

foundfiles=("${foundfiles[@]/#/\"}")
foundfiles=("${foundfiles[@]/%/\"}")

output - mostra o array completo, que é o índice [0] e [1]:

"very very latest"
"heisvery"
    
por 13.07.2015 / 18:54
2

Eu não acho que você queira as citações. Eu acho que você não quer dividir em campos no espaço em branco que não seja novidade.

Veja como fazer isso: link

E aqui está um exemplo

$ IFS=$'\n' read -d '' -r -a FOUNDFILES < <(echo -e "very very latest\nsome other line")
$ echo "${FOUNDFILES[0]}" 
 very very latest
$ echo "${FOUNDFILES[1]}" 
 some other line

<(echo -e "very very latest\nsome other line") seria realmente seu comando locate .

    
por 13.07.2015 / 16:18