Linux 셸에서 명령을 실행한 결과는 다음과 같다고 가정합니다.
X and Y are friends
각 단어(X, Y, 친구) 또는 결과의 상위 n 단어를 다른 작업에 사용할 수 있도록 분할하는 방법이 있습니까?
답변1
어때요 cut
?
$ phrase="X and Y are friends"
$ cut -d " " -f 1 <<< $phrase
X
$ cut -d " " -f 2 <<< $phrase
and
$ cut -d " " -f 3 <<< $phrase
Y
$ cut -d " " -f 4 <<< $phrase
are
$ cut -d " " -f 5 <<< $phrase
friends
-d
구분 기호(공백)와 필드 번호(구분 기호로 구분된 필드)를 지정합니다 -f
.
위의 예에서는 문자열을 변수에 배치했지만 명령의 출력을 파이프할 수 있습니다.
$ mycommand | cut -d " " -f 2
and
답변2
다음 명령을 사용하여 셸에서 직접 이 작업을 수행할 수도 있습니다 read
.
$ echo "X and Y are friends" |
while read a b c d e f
do echo "a is '$a', b is '$b', c is '$c', d is '$d', e is '$e', f is '$f'"
done
a is 'X', b is 'and', c is 'Y', d is 'are', e is 'friends', f is ''
기본 구분 기호는 공백이지만 변수를 변경하여 다른 것으로 설정할 수 있습니다 IFS
.
$ echo "foo:bar" | while IFS=: read a b; do echo "a is '$a', b is '$b'"; done
a is 'foo', b is 'bar'
답변3
쉘 스크립트에서 명령의 출력을 캡처하는 두 가지 주요 방법이 있습니다.명령 대체그리고read
내장.
출력을 단어로 분할하는 쉬운 방법은 셸에 내장된 분할 기능을 사용하여 출력을 배열에 넣는 것입니다.
words=($(echo "X and Y are friends"))
echo "The ${words[5]} are ${words[1]} and ${words[3]}"
이는 ksh931, mksh, bash, zsh 배열이 있는 쉘에서 작동합니다. 다른 쉘에서는 위치 인수를 제외하고 단어 목록을 저장할 수 없습니다.
set -- $(echo "X and Y are friends")
echo "The $5 are $1 and $3"
결과적으로 출력의 모든 단어는 와일드카드 패턴으로 처리되고 일치하는 파일 목록(있는 경우)으로 대체됩니다. (zsh를 제외하고 이는 sh 호환 모드를 제외하고 명시적으로 지시한 경우에만 수행됩니다.) 예를 들어 단어 중 하나가 이면 *
현재 디렉터리에 있는 파일 목록으로 대체됩니다. 이를 방지하려면 와일드카드 일치를 끄십시오.
set -f
words=($(echo "* and / are punctuation"))
echo "Here's some ${words[5]}: ${words[1]} and ${words[3]}"
set +f
를 사용하면 read
각 변수에 개별 단어를 할당할 수 있습니다. 까다로운 부분 read
은 표준 입력에서 읽기 때문에 일반적으로 파이프의 오른쪽으로 사용되지만 대부분의 셸(ATT ksh 및 zsh 제외)에서는 파이프의 양쪽이 하위 셸에서 실행되므로 변수 할당 파이프라인 외부에서 손실됩니다. 이를 read
일련의 지침의 일부로 사용할 수 있습니다 .
echo "X and Y are friends" | {
read -r first conjunction second verb complement remainder
echo "The $complement are $first and $second"
}
또는 ksh93, bash 또는 zsh에서 입력을 전달할 수 있습니다.프로세스 교체.
read -r first conjunction second verb complement remainder <(echo "X and Y are friends")
echo "The $complement are $first and $second"
배열에 단어를 저장하려면 read -rA words
mksh, ksh93 및 zsh 또는 read -ra words
bash에서 사용할 수 있습니다.
read -ra words <(echo "X and Y are friends")
동등하다
set -f; words=$((echo "X and Y are friends")); set +f
명령이 행을 출력하는 경우 -f
이전에 켜져 있었던 옵션은 재설정되지 않습니다.
¹ Ksh88에는 배열이 있지만 할당에서는 다른 구문을 사용합니다.
답변4
그리고 zsh
:
upToFirst5words=(${$(my-cmd)[1,5]})
기본값이 IFS의 기본값이라고 가정하면 시퀀스 공백(공백, 탭, 줄 바꿈) 또는 NUL로 분할됩니다.
할 수 있어요:
argv=(${$(my-cmd)[1,5]})
이 5개의 단어에 대해 $1
....$2
$5