따옴표를 사용하여 문자열을 추출해야 합니다. 내 문자열은 다음과 같습니다.
"abcd efgh" "ijkl mnop" "qrst uvwxyz"
ijkl mnop
sed
or 명령을 사용하여 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)