작은따옴표를 큰따옴표로 바꾸기

작은따옴표를 큰따옴표로 바꾸기

매개변수가 있고 vale '123', '234', 을 전달합니다 '456'.

$p='123','234','456'

이 값을 서로 다른 두 위치에 표시하고 싶습니다.

  • 1 위의 매개변수를 사용하겠습니다 = '123', '234','456'
  • 두 번째로 동일한 매개변수를 사용 $p하고 출력은 다음과 같아야 합니다.
''123'',''234'',''456''

어떻게 이것을 달성할 수 있습니까?

미리 감사드립니다

답변1

먼저 작은따옴표가 실제로 변수 값의 일부인지 확인해야 합니다.

p="'123','234','456'"

문자열을 큰따옴표로 묶으면 '123','234','456'쉘이 작은따옴표를 제거하지 못하게 됩니다. 큰따옴표가 없으면 변수 값은 string 으로 설정됩니다 123,234,456. 또한 변수에 값을 할당하려면 p변수 이름 앞에 no를 붙여야 합니다.$

이제 다음과 같이 작은따옴표를 사용하여 변수 값을 출력할 수 있습니다.

$ printf '%s\n' "$p"
'123','234','456'

다음과 같이 작은따옴표를 큰 작은따옴표로 변경하여 출력할 수도 있습니다.

$ printf '%s\n' "${p//\'/\'\'}"
''123'',''234'',''456''

또는 큰 따옴표(질문 태그를 수정하기 전에 원하는 것이라고 생각합니다):

$ printf '%s\n' "${p//\'/\"}"
"123","234","456"

${p//\'/\'\'}합계 비트는 ${p//\'/\"}'값의 모든 작은따옴표를 각각 큰따옴표 또는 큰따옴표로 변경하는 매개변수 대체의 예입니다 $p. 이 대체의 일반적인 형태는 다음과 같습니다 ${variable//pattern/string}.


예를 들어 숫자 123, 234, 456의 별도 목록이 있는 경우 이를 저장하는 가장 좋은 방법은 배열에 저장하는 것입니다.

p=( 123 234 456 1,234 "6'15\"" )   # Added 1,234 an 6'15" as extra elements

1,234이렇게 하면 특히 요소에 쉼표나 따옴표( 또는 에서 와 같이 6'15") 또는 나중에 각 요소 쌍 사이에 추가하려는 기타 문자가 포함될 수 있는 경우 요소 구성에 대한 모호성을 방지할 수 있습니다 . 일반적인 경우는 아마도 양의 정수가 아닐 것입니다.경로명, 여기에는 다음이 포함될 수 있습니다.어느nul( \0)을 제외한 문자로 구성되며, 경로 이름이 단일 문자열에 저장된 경우 하나의 경로 이름을 다른 경로 이름과 구별하기 어려울 수 있습니다.

그런 다음 문자열을 접두사 및 접미사로 추가하여 해당 배열의 각 요소를 수정하는 문제로 문제를 일반화할 수 있습니다. 이 일반적인 문제에 대한 해결 방법은 셸 함수를 통해 수행할 수 있습니다.

add_flanking_string_to_each () {
    # Adds a string to each element in an array,
    # both before each and after each element.
    # Requires bash 4.3+ for using name references.

    # Arg 1: name of input array
    # Arg 2: name of output array (will be emptied)
    # Arg 3: string

    local -n inarray="$1"
    local -n outarray="$2"
    local string="$3"

    local element

    outarray=()
    for element in "${inarray[@]}"; do
        outarray+=( "$string$element$string" )
    done
}

그런 다음 이 도우미 함수를 호출하여 원하는 데이터를 생성합니다.

for string in "'" "''" '"'; do
    add_flanking_string_to_each p pnew "$string"

   ( IFS=','; printf '%s\n' "${pnew[*]}" )
done

이것은 출력됩니다

'123','234','456','1,234','6'15"'
''123'',''234'',''456'',''1,234'',''6'15"''
"123","234","456","1,234","6'15""

답변2

노력하다

echo "${p//\'/\'\'}"
''123'',''234'',''456''

당신이 원하는 것을 얻으십시오.

관련 정보