사례 예:
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