큰따옴표 사이의 문자열 추출

큰따옴표 사이의 문자열 추출

따옴표를 사용하여 문자열을 추출해야 합니다. 내 문자열은 다음과 같습니다.

"abcd efgh" "ijkl mnop" "qrst uvwxyz"

ijkl mnopsedor 명령을 사용하여 grep두 번째 큰따옴표() 사이의 문자열을 가져오는 데 도움을 주실 수 있나요 ?

즉, 첫 번째 문자열을 따옴표로 묶으면 첫 번째 문자열을 원하고, 두 번째 문자열을 말하면 두 번째 큰따옴표를 제공해야 하며 큰따옴표 사이에 세 번째 A 문자열을 제공해야 합니다.

답변1

문자열을 어떻게 입력하고 싶은지 잘 모르겠습니다. 이는 이미 달성하려는 목표를 달성했지만 문자열 입력 방법에 따라 수정해야 할 수도 있습니다.

aa() { echo $3 ; } ; aa "abcd efgh" "ijkl mnop" "qrst uvwxyz"

편집하다:따라서 변수에 있는 경우(따옴표로 정의해야 함):

AA="\"abcd efgh\" \"ijkl mnop\" \"qrst uvwxyz\""
echo $AA

그 다음에:

FIRST=`echo $AA| awk -F \" '{print $2}'`
SECOND=`echo $AA| awk -F \" '{print $4}'`
THIRD=`echo $AA| awk -F \" '{print $6}'`
echo $FIRST : $SECOND : $THIRD

Jasonwryan이 위에서 지적했듯이. sed를 사용하고 싶다고 말했지만 이로 인해 불필요하게 복잡해졌습니다.

FIRST=`echo $AA| sed 's/^\"\([^\"]*\)\".*/\1/'`
SECOND=`echo $AA| sed 's/^\"[^\"]*\" \"\([^\"]*\)\".*/\1/'`
THIRD=`echo $AA| sed 's/^\"[^\"]*\" \"[^\"]*\" \"\([^\"]*\)\".*/\1/'`

편집 2: 실제로 sed, awk, Perl을 전혀 사용할 수 없습니다. .. 다음과 같이 내장된 "읽기" 기능을 사용하여 bash를 사용하십시오(echo는 디버깅에 사용됩니다).

#!/bin/bash

aa() {
echo '$1'="$1"
IFS=\" read aaa FIRST bbb SECOND ccc THIRD ddd <<< "$1"
echo FIRST=$FIRST : SECOND=$SECOND : THIRD=$THIRD
}

AA="\"abcd efgh\" \"ijkl mnop\" \"qrst uvwxyz\""
echo '$AA'="$AA"
aa "$AA"

답변2

댓글에서 이렇게 말씀하셨습니다.

위의 문자열은 변수입니다. 각 부분(첫 번째, 두 번째, 세 번째)을 추출하여 다른 변수에 저장해야 합니다.

그러니 헤어지자.

IFS=\"                  #set the shell's field separator
set -f                  #don't try to glob 
set -- $var             #split on $IFS
var1=$2 var2=$4 var3=$6 #yay
unset IFS               #restore something like a sane default

그러나 이는 백슬래시로 이스케이프된 따옴표를 포함할 수 있는 문자열을 처리하지 않습니다. 나는 그것을 좋아하지 않기 때문에 이것이 문제가되지 않기를 바랍니다.

답변3

ludvik02의 답변을 기반으로 (약간 단순화) sed:

AA='"abcd efgh" "ijkl mnop" "qrst uvwxyz"'
AA1=$(echo "$AA" | sed -r 's/^([^"]*"){1}([^"]*).*/\2/')
AA2=$(echo "$AA" | sed -r 's/^([^"]*"){3}([^"]*).*/\2/')
AA3=$(echo "$AA" | sed -r 's/^([^"]*"){5}([^"]*).*/\2/')
(Note that                        this ↑                        is different on every line.)

-r정규식을 확장하는 옵션을 활성화합니다 sed. 우리는 그것을 사용해야 합니다. 즉,{n}n이전 정규식의 발생 횟수입니다.  는 를 제외한 모든 문자와 일치하고 로 끝나는 ([^"]*")복합(그룹) 정규식입니다 . 예제 입력 문자열은 이 정규식과 최대 6번 일치할 수 있습니다(6개의 문자가 있기 때문). 문자열 사이의 간격을 구별하기 위해 s를 삽입합니다."""...

"abcd efgh" ... "ijkl mnop" ... "qrst uvwxyz"
↑↑--------↑↑----↑↑--------↑↑----↑↑----------↑
1    2       3       4       5        6

홀수(예: 3개) 항목을 일치시키면 첫 번째 n(예: 세 번째) "문자, 즉 "문자열의 시작을 참조하는 첫 번째(예: 두 번째) 문자까지 포함하여 모든 항목이 소비됩니다. 그런 다음 번째 문자(즉, 두 번째 인용 문자열 끝에 있는 문자)까지의 모든 항목을 일치(및 그룹화)합니다. 따라서 이 그룹(두 번째 그룹)은 두 번째로 인용된 문자열과 일치합니다. 마지막으로 입력 문자열의 나머지 부분이 사용됩니다. 그런 다음 전체 입력 행을 두 번째 세트의 값으로 바꿉니다.((n+1)/2)([^"]*)(n+1)"".*\2

"abcd efgh" ... "ijkl mnop" ... "qrst uvwxyz"
↑↑--------↑↑----↑⇑=======⇑⇈≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡⇈
1    2       3
↑---------------↑⇑=======⇑⇈≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡⇈
        \1          \2          (unnamed)

관련 정보