programing

셸 스크립트 - 변수에서 첫 번째와 마지막 따옴표(")를 제거합니다.

skycolor 2023. 4. 17. 21:37
반응형

셸 스크립트 - 변수에서 첫 번째와 마지막 따옴표(")를 제거합니다.

다음은 더 큰 스크립트에서 셸 스크립트의 일부입니다.변수에 의해 유지되는 문자열에서 따옴표가 삭제됩니다.sed로 하고 있는데, 효율이 좋은가요?그렇지 않다면, 어떻게 하면 효율적인 방법이 있을까요?

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp

tr을 사용하여 삭제":

 echo "$opt" | tr -d '"'

메모: 이것은 질문에 완전히 답하는 것이 아니라 선행과 후행뿐만 아니라 큰따옴표를 모두 삭제합니다.아래의 다른 답변을 참조하십시오.

네이티브 셸 프리픽스/서픽스 삭제 기능을 사용하여 보다 심플하고 효율적인 방법이 있습니다.

temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"

${opt%\"}는 접미사를 합니다."(셸 해석을 방지하기 위해 백슬래시를 사용합니다).

${temp#\"}는 프리픽스 「Prefix」를 삭제합니다."(셸 해석을 방지하기 위해 백슬래시를 사용합니다).

또 다른 장점은 따옴표가 있는 경우에만 따옴표가 제거된다는 것입니다.

참고로, 솔루션에서는 항상 첫 글자와 마지막 글자를 삭제합니다(물론 데이터는 알고 있겠지만 삭제할 내용은 항상 확인하는 것이 좋습니다).

sed 사용:

echo "$opt" | sed -e 's/^"//' -e 's/"$//'

(jfgagne에 나타나듯이 개량된 버전, 에코 제거)

sed -e 's/^"//' -e 's/"$//' <<<"$opt"

그것은 주도적인 것을 대신합니다."으로, 후행으로, 후행으로, 후행으로."아무것도 없이.같은 호출로 (파이프를 치고 다른 SED를 시작할 필요가 없습니다.)「」를 사용합니다.-e을 이용하다

, 더방법이 「 」를 해 주세요.-r옵션에서는 결과를 따옴표 없이 출력할 수 있습니다.

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar

xargs를 사용하는 간단한 방법은 다음과 같습니다.

> echo '"quoted"' | xargs
quoted

xargs는 명령어가 제공되지 않은 경우 echo를 기본명령어로 사용하며 입력에서 따옴표를 삭제합니다(여기 참조).단, 이 기능은 문자열에 따옴표가 추가되지 않은 경우에만 작동합니다.이 경우 오류가 발생하거나(따옴표 수가 올바르지 않음) 모두 제거됩니다.

cli aws cli cli 면면 면면 면면면--query이거 먹어봐. --output text

콜만으로 할 수 있습니다.sed:

$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\

가장 빠른 방법 - 시도해 보십시오.

echo $opt | sed "s/\"//g"

실제로 모든 을 제거할 수 있습니다."의 s(큰따옴표opt(처음과 끝 이외의 이중 따옴표는 없을까요?즉, 실제로는 같은 것으로, 보다 간단하게 실시할 수 있습니다.

Bash에서 가장 쉬운 솔루션:

$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc

이것을 서브스트링 확장이라고 부릅니다(Gnu Bash 매뉴얼을 참조해 주세요).${parameter:offset:length}에서는 이 , 음음음음음음ringringringring from from from from from from from from from from from from from from from from from from from from from from from from from from.s첫 번째 위치에서 시작하여 두 번째 마지막 위치에서 끝납니다.이것은 만약의 경우 때문이다.length입니다.이것은, 「부정수」의 됩니다.parameter.

갱신하다

bash / standard Linux 명령어사용하여 문자열에 포함된 단일 따옴표와 이중 따옴표를 제거하여 단순하고 우아한 답변을 제공합니다.

BAR=$(eval echo $BAR)BAR.

=============================================================

hueybois의 답변을 바탕으로 시행착오를 거듭한 끝에 이 기능을 고안했습니다.

function stripStartAndEndQuotes {
    cmd="temp=\${$1%\\\"}"
    eval echo $cmd
    temp="${temp#\"}"
    eval echo "$1=$temp"
}

없는 는, ./dev/null 2>&1.

사용방법:

$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR
Linux=`cat /etc/os-release | grep "ID" | head -1 | awk -F= '{ print $2 }'`

echo $Linux
Output:
"amzn"

변수에서 큰따옴표를 제거하는 가장 간단한 방법은 다음과 같습니다.

Linux=`echo "$Linux" | tr -d '"'` 
Linux=$(eval echo $Linux)
Linux=`echo ${Linux//\"/}`
Linux=`echo $Linux | xargs`

모두 큰따옴표 없이 출력을 제공합니다.

$Linux 에코

amzn

이것은 sed를 사용하지 않는 가장 개별적인 방법입니다.

x='"fish"'
printf "   quotes: %s\nno quotes:  %s\n" "$x" "${x//\"/}"

또는

echo $x
echo ${x//\"/}

출력:

   quotes: "fish"
no quotes:  fish

이건 소식통에서 얻은 거야

아주 오래된 질문인 건 알지만, 여기 또 다른 SED 변형이 있어요. 누군가에게 유용할 수도 있어요.다른 일부와 달리 시작이나 끝에만 큰 따옴표를 바꿉니다.

echo "$opt" | sed -r 's/^"|"$//g'

단일 따옴표 또는 이중 따옴표와 올바르게 따옴표로 묶인 문자열만 일치시켜야 하는 경우.조금 더 복잡한 정규식을 사용할 수 있습니다.

echo $opt | sed -E "s|^(['\"])(.*)\1$|\2|g"

이렇게 하면 백레퍼런스를 사용하여 끝부분의 견적이 시작부분과 동일하도록 합니다.

Bash 에서는, 다음의 원라이너를 사용할 수 있습니다.

[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"

에 저장되어 있는 에서 주변 따옴표와 따옴표 가됩니다.var문자열 내의 따옴표 문자를 그대로 유지합니다.또한 선행 따옴표가 하나이거나 후행 따옴표가 하나이거나 시작/끝에 혼재된 따옴표가 있는 경우에는 이 작업을 수행할 수 없습니다.


함수로 포장:

#!/usr/bin/env bash

# Strip surrounding quotes from string [$1: variable name]
function strip_quotes() {
    local -n var="$1"
    [[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
}

str="'hello world'"
echo "Before: ${str}"
strip_quotes str
echo "After: ${str}"

마이버전

strip_quotes() {
    while [[ $# -gt 0 ]]; do
        local value=${!1}
        local len=${#value}
        [[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g $1="${value:1:$len-2}"
        shift
    done
}

함수는 변수 이름을 받아들이고 따옴표를 제거합니다.선행 따옴표와 후행 따옴표 쌍이 일치하는 것만 삭제합니다.에 '따옴표'가 붙어 있음)는되지 않습니다.\그 자체는 탈출할 수 없습니다.)

으로는, 을 직접 조작하거나 하지 않거나,을 작성하지 , 「」의 외부 할 때,입니다. 이와 같은 범용 문자열 유틸리티 함수는 스트링을 직접 조작하거나 패턴 매칭을 사용하지 않거나 특히 서브셸을 작성하지 않거나 다음과 같은 외부 도구를 호출할 때 가장 효율적입니다.sed,awk ★★★★★★★★★★★★★★★★★」grep.

var1="\"test \\ \" end \""
var2=test
var3=\"test
var4=test\"
echo before:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done
strip_quotes var{1,2,3,4}
echo
echo after:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done

올바른 따옴표로 묶이지 않은 문자열에서 따옴표가 삭제되지 않도록 하기 위해 이 정규 표현을 사용합니다.여기서는 입력에 따라 다른 출력이 나타나는데, 영향을 받은 것은 시작 따옴표가 붙은 1개뿐입니다.

echo '"only first' | sed 's/^"\(.*\)"$/\1/'

출력:>"첫 번째만"<

echo 'only last"' | sed 's/^"\(.*\)"$/\1/'

출력: >"마지막만"<

echo '"both"' | sed 's/^"\(.*\)"$/\1/'

출력: > both <

echo '"space after" ' | sed 's/^"\(.*\)"$/\1/'

출력: >"space after" <

echo ' "space before"' | sed 's/^"\(.*\)"$/\1/'

출력: > "space before" <

STR='"0.0.0"' ## OR STR="\"0.0.0\""
echo "${STR//\"/}"
## Output: 0.0.0 

다른 방법이 있어요.예를 들어 다음과 같습니다.

echo ${opt:1:-1}

Make 파일에 따옴표가 보관되어 있기 때문에 따옴표를 삭제하려고 할 경우 다음을 시도해 보십시오.

$(subst $\",,$(YOUR_VARIABLE))

다른 답변에 근거합니다.https://stackoverflow.com/a/10430975/10452175

언급URL : https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable

반응형