Linux 셸에서 문자열을 배열의 작은따옴표로 변환하는 효율적인 방법

Linux 셸에서 문자열을 배열의 작은따옴표로 변환하는 효율적인 방법

사례 예:

Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
for i in "${Array[@]}"; do echo "$i"; done
Mary
had a __SingleQuote__little__SingleQuote__
lamb

나는 원해요변화문자열을 __SingleQuote__다음으로 변환아포스트로피 '문자이므로 배열은 다음과 같습니다.

ConvertedArray=( "Mary" "had a 'little'" "lamb" )
for i in "${ConvertedArray[@]}"; do echo "$i"; done
Mary
had a 'little'
lamb

어쩌면 다음과 같은 것일 수도 있습니다.

ConvertedArray=( "$(echo ${Array[@]} | sed s/___SingleQuote__/\'/ )" )

하지만 이 명령은 잘못된 결과를 낳습니다.

Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
ConvertedArray=( "$(echo ${Array[@]} | sed s/___SingleQuote__/\'/ )" )
for i in "${ConvertedArray[@]}"; do echo "$i"; done
Mary had a __SingleQuote__little__SingleQuote__ lamb

무엇인가요올바른 명령Linux 셸(또는 솔루션이 구체적이어야 하는 경우 Bash)에서 이 작업을 수행합니까?

루프를 구현할 수 있지만 배열이 매우 길어질 수 있으므로능률쉘 도구를 사용할 때 선호됩니다.

테스트됨:

  • command tr이지만 문자별로 음역됩니다.
  • 'sed' 명령을 실행했지만 'sed' 구문에 필요한 작은따옴표를 처리하는 데 문제가 있습니다.

답변1

에서는 bash요소별로 배열 요소에 전역 매개변수 대체를 적용할 수 있어야 합니다.

$ Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
$ ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb

예시 보기검색 및 바꾸기: 배열

답변2

물론 이것은 귀하가 요청한 내용을 인쇄합니다.

printf '%s\n' "${Array[@]//__SingleQuote__/\'}"

그러나 올바른 값을 가진 새 배열을 요구하므로 다음을 사용하십시오.

ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )

물론 ConvertedArray의 인덱스는 0부터 시작하는 숫자입니다. 이것은 문제가 되지 않는 것 같지만 (다른 답변의) 댓글에서 언급하셨으므로 계속 읽어보시기 바랍니다.


희소 배열

배열이 다음과 같이 정의된 경우:

$ Array=( [2]="Mary" [5]="had a __SingleQuote__little__SingleQuote__" [8]="lamb" )

그러면 배열이 희박해집니다(몇 개의 구멍이 있음).

$ declare -p Array
declare -a Array=([2]="Mary" [5]="had a __SingleQuote__little__SingleQuote__" [8]="lamb")

이 문제를 해결하려면 루프가 필요합니다.

$ for i in "${!Array[@]}"; do
>     ConvertedArray[i]="${Array[i]//__SingleQuote__/\'}"
> done
$ declare -p ConvertedArray
declare -a ConvertedArray=([2]="Mary" [5]="had a 'little'" [8]="lamb")

그리고

$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb    

답변3

나는 당신이 이것을 하기를 원한다고 가정합니다 bash. (아니면 처음부터 배열을 사용하지 않을 것입니다.)

$ echo "${Array[@]//__SingleQuote__/\'}"
Mary had a 'little' lamb
$ printf '%s\n' "${Array[@]//__SingleQuote__/\'}"
Mary
had a 'little'
lamb
$ ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb

위의 내용은 패턴 대체를 사용하여 모든 항목을 작은따옴표로 ${parameter//pattern/text}바꿉니다 . __SingleQuote__배열에 적용하면 각 요소에 대해 개별적으로 작업이 수행됩니다.


POSIX 셸에는 배열이 하나만 있습니다 $@.

set -- "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb"

i=0
while [ "$i" -ne "$#" ]; do
    set -- "$@" "$( printf '%s\n' "$1" | sed "s/__SingleQuote__/'/g" )"
    shift
    i=$(( i + 1 ))
done

printf '%s\n' "$@"

sed이는 자리 표시자 문자열을 작은따옴표 문자로 변환하기 위해 각 개별 매개변수를 입력하여 위치 매개변수 세트를 수정합니다. 첫 번째 위치 인수를 수정하고 결과를 의 끝에 추가합니다 $@. 그런 다음 배열에서 첫 번째 인수를 제거하고 모든 요소가 처리될 때까지 반복합니다.

위의 내용이 생성됩니다.

Mary
had a 'little'
lamb

관련 정보