문자열 변수의 N 번째 단어


85

Bash에서는 문자열 홀드의 N 번째 단어를 변수로 가져오고 싶습니다.

예를 들면 :

STRING="one two three four"
N=3

결과:

"three"

이 작업을 수행 할 수있는 Bash 명령 / 스크립트는 무엇입니까?

답변:


95
echo $STRING | cut -d " " -f $N

3
존재하지 않는 필드를 요청할 때 cut이 실패합니다. ""를 반환하는 대신 문자열 자체를 반환합니다. 예 : echo "aaaa"| cut -f2 결과는 "aaaa"이며 공백 0 길이 결과가 아닙니다.
ajaaskel 2018

@ajaaskel 입력에서 구분 기호 를 찾을 수 없을 때 발생하는 것 같습니다 . 그리고 그 동작은 이제 --only-delimited 옵션을 사용하여 변경할 수 있습니다.
Samuli Pahaoja

64

대안

N=3
STRING="one two three four"

arr=($STRING)
echo ${arr[N-1]}

3
이를 위해 bash 배열을 사용하는 것이 "최고의"솔루션입니다. 모든 설정, 특히 msys 설정에 설치된 것을 보지 못하기 때문에 awk 또는 sed를 사용하는 것이 싫습니다.
Sundar

1
에코가 "필요하지 않음"에도 불구하고 arr 요소를 사용하는 방법을 이해하는 데 유용하다는 것을 알았습니다. 감사합니다
첸 리 용

1
당신이 설정 한 경우 IFS':'을 (내부 필드 분리) 또는 대신 공백의 무언가를, 다시이를 시도하기 전에 변경합니다.
물 자체

1
이것이 정답이되어야합니다. 이 목적으로 배열을 사용하는 것은 간단하고 영리합니다.
ajaaskel

31

사용 awk

echo $STRING | awk -v N=$N '{print $N}'

테스트

% N=3
% STRING="one two three four"
% echo $STRING | awk -v N=$N '{print $N}'
three

9

일부 명령문이 포함 된 파일 :

cat test.txt

결과 :

This is the 1st Statement
This is the 2nd Statement
This is the 3rd Statement
This is the 4th Statement
This is the 5th Statement

따라서이 명령문 유형의 네 번째 단어를 인쇄하려면 다음을 수행하십시오.

cat test.txt |awk '{print $4}'

출력 :

1st
2nd
3rd
4th
5th

2
OP는 문자열이 파일이 아닌 변수에 있다고 말합니다.
codeforester 2018 년

3

값 비싼 포크, 파이프, 바 시즘 없음 :

$ set -- $STRING
$ eval echo \${$N}
three

그러나 글 로빙을 조심하십시오.


2
STRING=(one two three four)
echo "${STRING[n]}"

2
귀하의 예에서 STRING은 실제로 문자열입니까? 배열처럼 보입니다.
Nicolas Raoul 2013 년

@NicolasRaoul 네 실제로 맞아요. 그러나 나는 대안으로 썼다.
mnrl 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.