문자열 변수에서 두 번째 단어 추출


11

"rtcpOnNbActive true"변수에 문자열이 저장되어 있습니다 x. 하위 문자열로 "true"를 추출하여 변수에 저장하고 싶습니다. 어떻게해야합니까?


x추출하려는 부분 문자열 바로 앞에 항상 공백이 있습니까?
PM 2Ring

답변:


21

이 방법으로 시도하십시오 :

y=$(echo $x | awk '{print $2}')
echo $y
  • echo $x의 값을 표시합니다 x.
  • awk '{print $2}'이전에 표시된 두 번째 필드를 인쇄합니다 x.
  • $(... )출력을 잡고에 할당하십시오 y.

3
echo $x되고 하지 의 값을 표시x . printf '%s\n' "$x"될 것입니다.
Stéphane Chazelas

2
awk '{print $2}'이전에 표시된 각 줄 의 두 번째 필드 인쇄합니다 x.
Stéphane Chazelas

9

추출하려는 부분 문자열 앞에 공백이 하나 이상 있고 부분 문자열에 공백이 없다고 가정하면 간단한 매개 변수 확장으로이를 수행 할 수 있습니다.

x="rtcpOnNbActive     true"
y="${x##* }"
echo "[$y]"

산출

[true]

3
echo로 시작 -하지 않고 이스케이프 시퀀스를 포함 하지 않는 리터럴 문자열 이외의 것은 이식성이 없습니다 . bash 내장의 경우에도 컴파일 방법 및 XPG_ECHO설정 여부에 따라 동작이 다릅니다 . 문자열에 이스케이프 시퀀스가 ​​없다고 가정하면 문제가 없지만 printf '[%s]\n' "$y"여전히 좋습니다.
nyuszika7 시간

1
@ nyuszika7h : 좋은 지적, 그리고 Stéphane Chazelas를 읽은 후에도 이와 비슷한 말을하고 최근의 질문에서 나는 echo이와 같은 "throw-away"예에서도 변수의 가치를 표시하는 데 사용 하는 습관을 깨뜨려야 합니다.
PM 2Ring December

4

당신은 awk를 사용할 수 있습니다 :

echo "rtcpOnNbActive         true" | awk '{print $NF}'
true

NF 현재 레코드의 필드 수

sed를 사용하여 :

echo "rtcpOnNbActive         true" | sed 's/.* //g'
true

문자열 표현식 사용 :

 a="rtcpOnNbActive         true"
 echo ${a##* }
 true

grep을 사용하여 :

 echo "rtcpOnNbActive         true" | grep -Eo "[a-z]+$"
 true

-o는 정확히 일치 [a-z]+만하며 az의 문자와 일치 $하며 끝을 의미합니다.


2
같은 질문 에 다른 답변의 내용을 게시하지 마십시오 .
αғsнιη

1
다른 사람들이 대답하는 ????
Hackaholic

그는 여기에 큰 문제가 아닌 변수로 저장할 수 있습니다
Hackaholic

echo로 시작 -하지 않고 이스케이프 시퀀스를 포함 하지 않는 리터럴 문자열 이외의 것은 이식성이 없습니다 . bash 내장의 경우에도 컴파일 방법 및 XPG_ECHO설정 여부에 따라 동작이 다릅니다 . 또한 변수 확장 및 명령 대체를 항상 큰 따옴표로 묶어야합니다 (필요하지 않지만 해를 끼치 지 않는 특정 예외는 제외). OP와 같은 문자열을 사용하면 괜찮을지 모르지만 확인 printf '%s\n' "${a##* }"하려는 경우 더 좋습니다.
nyuszika7h

3

이를 위해 bash 배열을 사용할 수 있습니다.

arr="(first second third)"
echo ${arr[1]}

2

당신은 read내장을 사용할 수 있습니다

read -r _ y <<<"$x"
printf "%s\n" "$y"
true

왜 관련이 read있습니까? 그것은 read분할을하지 않습니다 -그것은입니다 $IFS. 어떤 이유로 많은 사람들 이 관여 할 $IFS 때만 분리하는 read것이 좋습니다. 당신은 할 수 있습니다 : set -f; IFS=' '; printf %.0s%s $x또는 무엇이든. 어쨌든- $IFS여기에 값 을 지정해야합니다 .
mikeserv

@ mikeserv,를 read사용하여 분할 IFS하고 있습니다 . 문서를 확인하십시오 . read 사용의 주요 이점은 변수를 설정하고 (OP 요구 사항) 문자열을 분할하고 배열을 채울 수 있다는 점에서 문자열에서 임의의 필드를 추출하는 데 좋습니다. 또한, 나는 기본을 가정하고 IFS여기하지만 필요한 경우 설정에 쉽게 충분, IFS=$' \n\t' read -r _ y <<<"$x"트릭 할 것
iruvar

아뇨. read할당, $IFS분할. 배열을 채우려면 사용 set하십시오.이 경우 인공 here-string 넌센스가 필요하지 않습니다. unset IFS기본 $ IFS 동작을 얻습니다.
mikeserv

@ mikeserv, 당신은 내 크리스마스 카드 목록에서 벗어났습니다.
iruvar

바 험버트. 크리스마스는 빨판입니다.
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.