IT

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

lottoking 2020. 3. 24. 08:15
반응형

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


문자열 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의 (한 세트) 솔루션이 있습니다.

$ 에코 1 : 2 : 3 : 4 : 5 | awk -F : '{print $ NF}'
5
$ 에코 1 : 2 : 3 : 4 : 5 | 펄 -F : -wane 'print $ F [-1]'
5

상당히 간단한 사용법 (예 : 구분 기호를 이스케이프 처리하지 않음)을 가정하면 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

마지막 필드가 단일 문자 인 경우 다음을 수행 할 수 있습니다.

a="1:2:3:4:5"

echo ${a: -1}
echo ${a:(-1)}

bash에서 문자열 조작을 확인하십시오 .


여기에는 많은 좋은 답변이 있지만 여전히 basename을 사용 하여이 답변을 공유하고 싶습니다 .

 basename $(echo "a:b:c:d:e" | tr ':' '/')

그러나 문자열에 이미 '/'가 있으면 실패합니다 . 슬래시 /가 구분 기호 인 경우 basename을 사용해야합니다.

가장 좋은 대답은 아니지만 bash 명령을 사용하여 창의성을 발휘하는 방법을 보여줍니다.


배쉬 사용하기.

$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo  \$${#}
0

echo "a:b:c:d:e"|xargs -d : -n1|tail -1

먼저 xargs를 사용하여 ":"을 사용하여 분할합니다. -n1은 모든 행에 하나의 파트 만 있음을 의미합니다.


for x in `echo $str | tr ";" "\n"`; do echo $x; done

Python에 익숙한 사람들에게는 https://github.com/Russell91/pythonpy 가이 문제를 해결하기위한 좋은 선택입니다.

$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'

pythonpy 도움말에서 : -x treat each row of stdin as x.

이 도구를 사용하면 입력에 적용되는 파이썬 코드를 쉽게 작성할 수 있습니다.


간단한 해결책은 입력 문자열의 순서를 반대로하는 것이지만 대답에 약간 늦을 수 있습니다. 이렇게하면 길이에 관계없이 항상 마지막 항목을 얻을 수 있습니다.

[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5

그러나이 방법을 사용하고 숫자가 1 자리보다 크거나 (어떤 상황에서든 한 문자보다 큰 경우) 파이프 출력에 대해 다른 'rev'명령을 실행해야합니다.

[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24

내가 도울 수 있기를 바랍니다


내장 된 읽기를 사용하는 솔루션 :

IFS=':' read -a fields <<< "1:2:3:4:5"
echo "${fields[4]}"

또는 더 일반적인 것으로 만들려면

echo "${fields[-1]}" # prints the last item

파이썬을 좋아하고 패키지를 설치할 수있는 옵션이 있다면 이 파이썬 유틸리티를 사용할 수 있습니다 .

# install pythonp
pythonp -m pip install pythonp

echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5

정규식 일치 sed는 욕심이 많으며 (항상 마지막 항목으로 이동) 다음과 같은 이점을 얻을 수 있습니다.

$ foo=1:2:3:4:5
$ echo ${foo} | sed "s/.*://"
5

참고 URL : https://stackoverflow.com/questions/3162385/how-to-split-a-string-in-shell-and-get-the-last-field

반응형