답변:
문자열 연산자 를 사용할 수 있습니다 .
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
이것은 전면에서 ':'까지 탐욕스럽게 모든 것을 다듬습니다.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
. #
-처음부터; %
-끝에서. #
, %
- 짧은 일치; ##
, %%
-가장 긴 일치.
echo ${pwd##*/}
작동하지 않습니다.
pwd
은 변수로 간주 됩니다. 시도하십시오 dir=$(pwd); echo ${dir##*/}
. 나를 위해 작동합니다!
또 다른 방법은 전후를 뒤집는 것입니다 cut
.
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
이렇게하면 마지막 필드 하나만 또는 끝에서 번호가 매겨진 필드 범위를 매우 쉽게 얻을 수 있습니다.
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
. cut -b20- | rev | cut -b10- | rev
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]'
/
문자 를 포함하거나 포함하지 않는 경로와 일치 /a/b/c/d
하며 처리 할 때 /a/b/c/d/
동일한 결과 ( d
)를 생성 pwd | awk -F/ '{print $NF}'
합니다. /a/b/c/d/
/
구분 기호로 사용 되며 경로가 /my/path/dir/
마지막 구분 기호 뒤에 값을 사용합니다. 이는 단순히 빈 문자열입니다. 따라서 내가하는 것과 같은 일을 해야하는 경우 슬래시를 피하는 것이 가장 좋습니다.
awk '{$NF=""; print $0}' FS=: OFS=:
종종 비슷한 기능이 충분합니다.
상당히 간단한 사용법 (예를 들어 구분 기호를 이스케이프 처리하지 않음)을 가정하면 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]}
사용 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에서 문자열 조작을 확인하십시오 .
a
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
내가 도울 수 있기를 바랍니다
파이썬을 좋아하고 패키지를 설치할 수있는 옵션이 있다면 이 파이썬 유틸리티를 사용할 수 있습니다 .
# install pythonp
pythonp -m pip install pythonp
echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
패키지 의 전체 목적은 python -c
더 적은 문자 입력과 동일한 작업을 수행하는 것 입니다. 저장소의 README를 살펴보십시오.
5
은 문자열이1:2:3:4:5:
(문자열 연산자를 사용하는 동안 빈 결과를 생성하는 경우 ) 반환 합니다 . 마무리/
문자를 포함하거나 포함하지 않을 수있는 경로를 구문 분석 할 때 특히 유용 합니다.