셸 스크립트 - 변수에서 첫 번째와 마지막 따옴표(")를 제거합니다.
다음은 더 큰 스크립트에서 셸 스크립트의 일부입니다.변수에 의해 유지되는 문자열에서 따옴표가 삭제됩니다.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
'programing' 카테고리의 다른 글
Swift에서 XIB 파일을 사용하여 커스텀 UIView 클래스를 초기화/인스턴스하는 방법 (0) | 2023.04.17 |
---|---|
(Excel) 인접 셀 값에 따른 조건부 포맷 (0) | 2023.04.17 |
프로젝트별로 Git 구성을 다르게 할 수 있나요? (0) | 2023.04.17 |
TextBox에서 Enter 키 (0) | 2023.04.17 |
Swift의 if 스테이트먼트 내에서 여러 개의 let-as 사용 (0) | 2023.04.17 |