다음은 더 큰 스크립트의 쉘 스크립트 스 니펫입니다. 변수가 보유한 문자열에서 따옴표를 제거합니다. sed를 사용하여하고 있지만 효율적입니까? 그렇지 않다면 효율적인 방법은 무엇입니까?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
다음은 더 큰 스크립트의 쉘 스크립트 스 니펫입니다. 변수가 보유한 문자열에서 따옴표를 제거합니다. sed를 사용하여하고 있지만 효율적입니까? 그렇지 않다면 효율적인 방법은 무엇입니까?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
답변:
기본 셸 접두사 / 접미사 제거 기능을 사용하면 더 간단하고 효율적인 방법이 있습니다.
temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"
${opt%\"}
접미사를 제거합니다 "
(쉘 해석을 방지하기 위해 백 슬래시로 이스케이프 처리).
${temp#\"}
접두사를 제거합니다 "
(쉘 해석을 방지하기 위해 백 슬래시로 이스케이프 처리).
또 다른 장점은 주변 인용 부호가있는 경우에만 주변 인용 부호를 제거한다는 것입니다.
BTW, 솔루션은 항상 첫 번째 문자와 마지막 문자를 제거합니다 (물론 데이터를 알고 있다고 확신하지만 제거하는 것을 항상 확인하는 것이 좋습니다).
sed 사용하기 :
echo "$opt" | sed -e 's/^"//' -e 's/"$//'
(jfgagne에서 표시 한대로 에코를 제거하는 개선 된 버전)
sed -e 's/^"//' -e 's/"$//' <<<"$opt"
따라서 선행 "
은 아무것도 아닌 것으로 바꾸고 후미도 아무것도 아닌 것으로 바꿉니다 "
. 동일한 호출에서 (다른 sed를 파이프하고 시작할 필요가 없습니다. 사용 -e
하면 여러 개의 텍스트 처리가 가능합니다).
sed -e 's/^"//' -e 's/"$//' <<< $opt
.
sed
정규 표현식을 사용하거나 변수 대체를 줄 바꿈case $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
이렇게하면 큰 따옴표가 모두 제거됩니다.
echo "${opt//\"}"
Don't remove this \" quote
. :-(
xargs를 사용하는 간단한 방법이 있습니다 .
> echo '"quoted"' | xargs
quoted
명령이 제공되지 않으면 xargs 는 echo를 기본 명령으로 사용하고 입력에서 따옴표를 제거합니다. 예를 들어 여기를 참조 하십시오 .
echo '"quoted"' | xargs
-> quoted
한 번만 호출하면됩니다 sed
.
$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\
가장 짧은 방법 -시도 :
echo $opt | sed "s/\"//g"
실제로 모든 "
s (큰 따옴표)를 제거합니다 ( opt
처음과 끝이 아닌 다른 큰 따옴표가 실제로 있습니까? 그래서 실제로는 똑같은 것입니다. ;-)
jq를 사용하고 결과에서 따옴표를 제거하려고하면 다른 답변이 효과가 있지만 더 좋은 방법이 있습니다. -r
옵션 을 사용하면 따옴표없이 결과를 출력 할 수 있습니다.
$ echo '{"foo": "bar"}' | jq '.foo'
"bar"
$ echo '{"foo": "bar"}' | jq -r '.foo'
bar
jq
있지만 jq도 ASCII 출력을 출력하는 경우 작동하지 않는다는 점에 유의하십시오 -a
(jq 측 버그입니다)
yq
또한이 -r
옵션을 :yq -r '.foo' file.yml
최신 정보
bash / 표준 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
Bash에서 가장 쉬운 솔루션 :
$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc
이것을 부분 문자열 확장이라고합니다 ( Gnu Bash 매뉴얼 참조 및 검색 ${parameter:offset:length}
). 이 예제에서는 하위 문자열이 s
위치 1 에서 시작하여 두 번째 마지막 위치에서 끝나는 것을 가져옵니다 . 이는 경우는 사실이다 length
음의 값입니다 뒤로가의 끝에서 오프셋 실행으로 해석됩니다 parameter
.
내 버전
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
나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 여기에 다른 sed 변형이있어 누군가에게 유용 할 수 있습니다. 다른 것들 중 일부와 달리 시작이나 끝에서 큰 따옴표 만 대체합니다 ...
echo "$opt" | sed -r 's/^"|"$//g'
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. 이 구문은 일치하는 쌍이있는 경우에만 qoutes를 제거합니다.