쉘에서 문자열을 나누고 마지막 필드를 얻는 방법
문자열 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
'IT' 카테고리의 다른 글
배열을 SimpleXML로 변환하는 방법 (0) | 2020.03.24 |
---|---|
const를 사용하는 경우 JSHint에서 경고를 발생시키는 이유는 무엇입니까? (0) | 2020.03.24 |
사용중인 Angular 버전을 어떻게 확인할 수 있습니까? (0) | 2020.03.24 |
bash 쉘 스크립트에서 모든 인수를 전파하십시오. (0) | 2020.03.24 |
GitHub의 명령 행에서 풀 요청을 발행 할 수 있습니까? (0) | 2020.03.24 |