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"