답변:
Awk는 후행 공백을 처리해야하는 경우 좋은 옵션입니다.
echo " word1 word2 " | awk '{print $1;}' # Prints "word1"
하지만 컷은 이것을 처리하지 않습니다.
echo " word1 word2 " | cut -f 1 -d " " # Prints nothing/whitespace
여기서 'cut'은 공백 / 공백을 인쇄하지 않습니다. 공백 앞에있는 첫 번째 항목은 다른 공백 이었기 때문입니다.
-F","
쉼표로 기본 필드 구분 기호 (공백)를 재정의하는 데 사용할 수 있습니다.
외부 명령을 사용할 필요가 없습니다. 배쉬 자체가 그 일을 할 수 있습니다. "word1 word2"를 어딘가에서 가져와 변수에 저장했다고 가정합니다. 예 :
$ string="word1 word2"
$ set -- $string
$ echo $1
word1
$ echo $2
word2
이제 원하는 경우 $ 1 또는 $ 2 등을 다른 변수에 할당 할 수 있습니다.
stdin
. M. @ 매트의 --
수단은 stdin
, 그래서 $string
로 전달되고있다 stdin
. stdin
인수에 공백으로 분리 $1
, $2
, $3
, 등 - 단지 배쉬 프로그램 평가하여 인수 (예를 들어 체크 할 때처럼 $1
, $2
등),이 방법은 분할 쉘의 경향을 활용 stdin
에 대한 필요성을 제거, 자동 인수로 awk
또는 cut
.
set
셸 인수를 설정합니다.
word1=$(IFS=" " ; set -- $string ; echo $1)
단어 사이의 공백을 올바르게 인식하도록 IFS를 설정하십시오. $ 1의 원본 콘텐츠를 방해하지 않도록 괄호로 묶습니다.
string="*"
. 놀라다.
효율적인 방법 중 하나는 bash 배열을 사용하는 것입니다.
array=( $string ) # do not use quotes in order to allow word expansion
echo ${array[0]} # You can retrieve any word. Index runs from 0 to length-1
또한 파이프 라인에서 배열을 직접 읽을 수 있습니다.
echo "word1 word2" | while read -a array; do echo "${array[0]}" ; done
echo " word1 word2 " | { read -a array ; echo ${array[0]} ; }
string="*"
. 놀라다.
while
구문을 사용하여 각 줄에서 모든 첫 번째 단어를 검색합니다. 그렇지 않으면 Boontawee Home 접근 방식을 사용하십시오. 또한 echo "${array[0]}"
gniourf-gniourf에서 알 수 있듯이 확장을 방지하기 위해 인용되었습니다.
echo "word1 word2 word3" | { read first rest ; echo $first ; }
이것은 외부 명령을 사용하지 않고 $ 1, $ 2 등의 변수를 그대로 두는 장점이 있습니다.
$1, $2, …
그대로 두는 것은 스크립트 작성에 매우 유용한 기능입니다!
선행 공백이없는 것이 확실한 경우 bash 매개 변수 대체를 사용할 수 있습니다.
$ string="word1 word2"
$ echo ${string/%\ */}
word1
단일 공간을 벗어나지 않도록주의하십시오. 대체 패턴의 더 많은 예는 여기 를 참조 하십시오 . bash> 3.0 인 경우 정규식 일치를 사용하여 선행 공백에 대처할 수도 있습니다 . 여기를 참조 하십시오 .
$ string=" word1 word2"
$ [[ ${string} =~ \ *([^\ ]*) ]]
$ echo ${BASH_REMATCH[1]}
word1
%% *
다음은 쉘 매개 변수 확장을 사용하는 또 다른 솔루션 입니다. 첫 단어 뒤의 여러 공백을 처리합니다. 첫 번째 단어 앞의 공백을 처리하려면 추가 확장이 필요합니다.
string='word1 word2'
echo ${string%% *}
word1
string='word1 word2 '
echo ${string%% *}
word1
%%
의미 삭제 의 가장 긴 일치 *
에서 (공간이 어떤 다른 문자의 수에 따라) 후행 의 일부 string
.
속도 측면에서 몇 가지 상위 답변이 어떻게 측정되는지 궁금했습니다. 다음을 테스트했습니다.
1 @mattbh의
echo "..." | awk '{print $1;}'
2 @ ghostdog74 's
string="..."; set -- $string; echo $1
3 @ boontawee-home 's
echo "..." | { read -a array ; echo ${array[0]} ; }
그리고 4 @ boontawee-home 's
echo "..." | { read first _ ; echo $first ; }
나는 215 개의 5 글자 단어가 포함 된 테스트 문자열을 사용하여 macOS의 Zsh 터미널에있는 Bash 스크립트에서 Python의 timeit으로 측정했습니다. 각 측정을 5 번 수행하고 (결과는 모두 100 개의 루프, 3 개 중 최고) 결과를 평균화했습니다.
method time
--------------------------------
1. awk 9.2ms
2. set 11.6ms (1.26 * "1")
3. read -a 11.7ms (1.27 * "1")
4. read 13.6ms (1.48 * "1")
유권자 여러분, 잘하셨습니다 👏 투표는 솔루션의 속도와 일치합니다!
read -a
유효 하지 않음 ).
echo "word1 word2" | cut -f 1 -d " "
cut은 문자열 ""(-d "")로 구분 된 필드 목록에서 첫 번째 필드 (-f 1)를 자릅니다.
read
당신의 친구입니다:
문자열이 변수에있는 경우 :
string="word1 word2"
read -r first _ <<< "$string"
printf '%s\n' "$first"
파이프에서 작업하는 경우 : 첫 번째 경우 : 첫 번째 줄의 첫 번째 단어 만 원합니다.
printf '%s\n' "word1 word2" "line2" | { read -r first _; printf '%s\n' "$first"; }
두 번째 경우 : 각 줄의 첫 번째 단어가 필요합니다.
printf '%s\n' "word1 word2" "worda wordb" | while read -r first _; do printf '%s\n' "$first"; done
선행 공백이있는 경우 작동합니다.
printf '%s\n' " word1 word2" | { read -r first _; printf '%s\n' "$first"; }
나는 perl, awk 또는 python이없는 임베디드 장치로 작업하고 있었고 대신 sed로 작업했습니다. 첫 번째 단어 앞에 여러 공백을 지원합니다 ( cut
및 bash
솔루션이 처리하지 않음).
VARIABLE=" first_word_with_spaces_before_and_after another_word "
echo $VARIABLE | sed 's/ *\([^ ]*\).*/\1/'
ps
bash 만 사용하는 다른 솔루션은 ps
정렬에 사용 되는 첫 번째 공백을 제거 할 수 없었기 때문에 프로세스 ID를 찾을 때 매우 유용했습니다 .