따옴표 안에 문자를 사용하지 않은 Bash 문자열의 일부

따옴표 안에 문자를 사용하지 않은 Bash 문자열의 일부

그래서 나는 다음과 같은 문자열에서 얻고 싶습니다 :

q='"Something, variable", another part, third one'

"뭔가, 가변적인 것" 부분입니다.

내가 얻을 수 있나요?

'"Something'

사용 ${q%%,*}.

하지만 bash가 따옴표 안의 쉼표(또는 다른 문자)를 무시하도록 하려면 어떻게 해야 할까요?

답변1

echo "${q%"${q#*\"*\"}"}"

"Something, variable"

... 다음을 사용하여 리터럴 해석 "에서 발견된 두 번째 큰따옴표의 결과를 제거하여 이 두 개의 따옴표에만 적용됩니다.$q(읽기 - 내부 인용문)$q의 끝에서 제거할 패턴 문자열입니다. $q확장에 두 개의 큰따옴표가 없으면 null 을 반환합니다.

또한, 이들 중 첫 번째를 선도하는 캐릭터가 있는 경우 $q에도 보존됩니다.

그래서...

q='x""'
echo "${q%"${q#*\"*\"}"}"

x""

다음과 같이 처리할 수 있습니다.

[ -z "${q##\"*}" ] || q=\"${q#*\"}
echo "$q"

""

답변2

코어에 파서가 있으므로 사용이 매우 간단합니다 perl.Text::ParseWords

#!/usr/bin/env perl
use strict;
use warnings;
use Text::ParseWords; 
use Data::Dumper; 

my $q = '"Something, variable", another part, third one';
my @words = parse_line ( ',', 0, $q );

#dump words:
print Dumper \@words; 

#just output first one: 
print $words[0];

또는 한 줄로 작성하여 셸에서 인라인으로 사용할 수 있습니다.

echo $q | perl -MText::ParseWords -e '@w=parse_line(',',0,<>);print $w[0]'

STDIN에서 읽고 STDOUT에서 첫 번째로 구문 분석된 "단어"를 인쇄합니다.

(또는 via 또는 이와 유사한 방법을 통해 입력할 수도 있습니다 $ENV{q}).

답변3

내부 필드 구분 기호를 변경해야 합니다: IFS

q='"Something, variable", another part, third one'

# save actual IFS
_old_ifs="${IFS}"
# set IFS to ","
IFS=","
# split q with this new IFS
set -- `echo ${q}`
# restore standard IFS
IFS="${_old_ifs}"

echo \'$1\'

답변4

큰따옴표 문자를 필드 구분 기호로 지정하고 두 번째 필드만 출력하도록 요구하여 컷을 통해 파이프할 수 있습니다.

$ q='"Something, variable", another part, third one'

$ echo $q | cut -d\" -f2
Something, variable

관련 정보