각 값을 큰따옴표로 묶어서 명령의 출력을 배열에 저장하는 방법

각 값을 큰따옴표로 묶어서 명령의 출력을 배열에 저장하는 방법

각 출력을 큰따옴표로 묶은 배열 값에 저장하고 싶습니다. 값에는 공백이 있을 수도 있습니다.

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

찾기 명령에 대한 입력이 매우 최신인 경우(매우 최신 정보는 파일 이름입니다). "매우 최신"으로 저장되어야 합니다. 매우라는 단어가 포함된 다른 파일도 찾을 수 있습니다. 따라서 heisvery와 같은 다른 파일이 있는 경우 "heisvery"와 같이 저장해야 합니다. 여기서 "veryverylatest"는 배열의 0번째 값이고 "heisvery"는 배열의 값 1입니다.

답변1

실제로 데이터의 일부가 아닌 선행 및 후행 따옴표와 함께 문자열(변수에)을 저장해야 하는 경우는 매우 드뭅니다. 일반적으로 후처리가 가장 좋습니다.

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

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

locate출력 으로정규화된 경로,
-b옵션은 검색만 의미합니다.두번째asename,
당신이 원하는오직캡처할 기본 이름으로, 해당 부분을 제거하는 데
사용할 수 있습니다 . sed/pa/th/

"최신"을 검색하고 싶을 때가득한기본 이름을 입력
하고 "very"도 검색하려고 합니다.어딘가에기본 이름에
정말 사용해야합니다정규식찾다.

  • -r 기본 정규식 검색
  • --regex확장 정규식 검색(아래 예에서 사용됨)

배열이 전체 행을 캡처하도록 하려면 다음을 변경해야 합니다.내부에프​필드에스구분 기호(IFS) \n만 해당됩니다.

배열 항목이 발견되면 캡처/저장됩니다.위치산출. 배열과 동일한 순서로 정렬하려면 input배열에 대한 추가 처리가 필요합니다(다음을 통해).for..grep..loop..awk다음과 같은).

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[@]}"

출력 - 전체 배열, 즉 인덱스 [0] 및 [1]을 표시합니다.

very very latest
heisvery

네가 원한다면인쇄 기능출력은 따옴표로 묶여 있습니다. 마지막 줄을 다음으로 변경하십시오.
printf '"%s"\n' "${foundfiles[@]}"

...또는 배열 자체에 따옴표를 추가해야 하는 경우 다음에서 수행하세요.for..grep..loop

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

출력 - 전체 배열, 즉 인덱스 [0] 및 [1]을 표시합니다.

"very very latest"
"heisvery"

답변2

나는 당신이 따옴표를 원하지 않는다고 생각합니다. 나는 개행 문자가 아닌 공백으로 필드를 분할하고 싶지 않다고 생각합니다.

수행 방법은 다음과 같습니다. https://stackoverflow.com/questions/11393817/bash-read-lines-in-file-into-an-array

이것은 예이다

$ 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")그것은 정말로 당신의 locate명령입니다.

관련 정보