[bash] 쉘에서 문자열을 나누고 마지막 필드를 얻는 방법

문자열 1:2:3:4:5이 있고 마지막 필드 ( 5이 경우) 를 가져오고 싶다고 가정하십시오 . Bash를 사용하여 어떻게합니까? 시도했지만으로 cut마지막 필드를 지정하는 방법을 모르겠습니다 -f.



답변

문자열 연산자 를 사용할 수 있습니다 .

$ foo=1:2:3:4:5
$ echo ${foo##*:}
5

이것은 전면에서 ‘:’까지 탐욕스럽게 모든 것을 다듬습니다.

${foo  <-- from variable foo
  ##   <-- greedy front trim
  *    <-- matches anything
  :    <-- until the last ':'
 }


답변

또 다른 방법은 전후를 뒤집는 것입니다 cut.

$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef

이렇게하면 마지막 필드 하나만 또는 끝에서 번호가 매겨진 필드 범위를 매우 쉽게 얻을 수 있습니다.


답변

cut을 사용하여 마지막 필드를 얻는 것은 어렵지만 awk 및 perl의 솔루션은 다음과 같습니다.

echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'


답변

상당히 간단한 사용법 (예를 들어 구분 기호를 이스케이프 처리하지 않음)을 가정하면 grep을 사용할 수 있습니다.

$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5

분류-줄 끝 ($)에서 분리 문자 ([^ :])가 아닌 모든 문자를 찾으십시오. -o는 일치하는 부분 만 인쇄합니다.


답변

일방 통행:

var1="1:2:3:4:5"
var2=${var1##*:}

또 하나는 배열을 사용합니다.

var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}

또 다른 배열 :

var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}

Bash (버전> = 3.2) 정규식 사용 :

var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}


답변

$ echo "a b c d e" | tr ' ' '\n' | tail -1
e

구분 기호를 줄 바꿈으로 변환하고로 마지막 항목을 선택하십시오 tail -1.


답변

사용 sed:

$ echo '1:2:3:4:5' | sed 's/.*://' # => 5

$ echo '' | sed 's/.*://' # => (empty)

$ echo ':' | sed 's/.*://' # => (empty)
$ echo ':b' | sed 's/.*://' # => b
$ echo '::c' | sed 's/.*://' # => c

$ echo 'a' | sed 's/.*://' # => a
$ echo 'a:' | sed 's/.*://' # => (empty)
$ echo 'a:b' | sed 's/.*://' # => b
$ echo 'a::c' | sed 's/.*://' # => c