출력에서 다른 단어를 잘라냅니다.

출력에서 다른 단어를 잘라냅니다.

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 wordsmksh, ksh93 및 zsh 또는 read -ra wordsbash에서 사용할 수 있습니다.

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

관련 정보