이 명령이 문자열의 cut
첫 번째 문자를 인쇄할 수 있다는 것을 알고 있지만 마지막 문자를 선택하는 방법은 무엇입니까?n
n
가변 개수의 문자가 포함된 문자열이 있는 경우 문자열의 마지막 세 문자만 인쇄하려면 어떻게 해야 합니까? 예를 들어.
원하는 "무한" 출력은 "ted"입니다. "987654"의 원하는 출력은 "654"입니다. "123456789"에 필요한 출력은 "789"입니다.
답변1
왜 아무도 명확한 답을 가지고 있지 않습니까?
sed 's/.*\(...\)/\1/'
...또는 약간 덜 분명한 것
grep -o '...$'
물론 두 번째는 3자 미만의 줄이 사라지는 단점이 있지만 이 질문은 이 경우의 동작을 명확하게 정의하지 않습니다.
답변2
간단하게 유지하세요 - 꼬리
문자 수를 계산하기 위해 정규식이나 여러 프로세스가 필요하지 않습니다.
이 명령은 tail
마지막 항목을 표시하는 데 자주 사용됩니다.철사파일에는 이 작업을 수행하는 데 적합한 도구로 보이는 옵션 -c
( ) 이 있습니다 .--bytes
$ printf 123456789 | tail -c 3
789
(셸에 있을 때는 시작 프로세스를 저장하므로 mikeserv의 답변에 있는 메서드를 사용하는 것이 합리적입니다 tail
.)
실제 유니코드 문자?
이제 마지막 세 가지를 묻습니다.수치;이 답변은 그렇지 않습니다. 마지막 3개를 출력합니다.바이트!
각 문자가 바이트이면 tail -c
괜찮습니다. 따라서 문자 집합이 있는 한 사용할 수 있습니다.ASCII
,ISO 8859-1
또는 변형.
일반적으로 유니코드 입력이 있는 경우UTF-8
잘못된 형식, 잘못된 결과:
$ printf 123αβγ | tail -c 3
�γ
이 예에서는 UTF-8
그리스 문자 알파, 베타, 감마를 사용하여 길이가 2바이트입니다.
$ printf 123αβγ | wc -c
9
이 옵션은 -m
최소한 실제 유니코드 문자 수를 계산합니다.
printf 123αβγ | wc -m
6
좋습니다. 마지막 6바이트는 마지막 3자를 제공합니다.
$ printf 123αβγ | tail -c 6
αβγ
따라서 tail
일반 문자 처리는 지원되지 않으며 시도조차 하지 않습니다(아래 참조). 가변 크기 줄은 처리하지만 가변 크기 문자는 처리하지 않습니다.
이렇게 표현해 보겠습니다. tail
해결하려는 문제의 구조에는 맞지만 데이터 유형에는 맞지 않습니다.
GNU 핵심 도구
sed
더 자세히 살펴보면 GNU coreutils( , ls
, tail
및 과 같은 기본 도구 모음 cut
)은 아직 완전히 국제화되지 않았습니다. 주로 유니코드를 지원합니다.
예를 들어, cut
여기에서 문자를 지원하기 위해 tail 대신 tail을 사용하는 것은 좋은 선택입니다. 여기에는 바이트나 문자 -c
(( --bytes
) 및 -m
( --chars
) 처리 옵션이 있습니다.
단지 -m
/ 2013 버전 --chars
이후로 구현되지 않았습니다 !
cut (GNU coreutils) 8.21
에서 info cut
:
`-c CHARACTER-LIST'
`--characters=CHARACTER-LIST'
Select for printing only the characters in positions listed in CHARACTER-LIST.
The same as `-b' for now, but internationalization will change that.
이것도 보세요답변도착하다UTF-8에서 `cut -c`(`--characters`)를 사용할 수 없나요?.
답변3
텍스트가 이름이 지정된 셸 변수에 있는 경우 , 또는 셸 에서 이 작업을 수행 STRING
할 수 있습니다 .bash
zsh
mksh
busybox ash
printf '%s\n' "${STRING:(-3)}"
또는
printf '%s\n' "${STRING: -3}"
이 구문의 소스인 ksh93과 함께 사용하는 것도 좋습니다.
요점은 :
을 와 분리 해야 한다는 것입니다. 그렇지 않으면 Bourne 쉘 연산자 -
가 됩니다 .${var:-default}
zsh
또는 셸의 해당 구문은 다음 yash
과 같습니다.
printf '%s\n' "${STRING[-3,-1]}"
답변4
문자열이 변수에 있으면 다음을 수행할 수 있습니다.
printf %s\\n "${var#"${var%???}"}"
이렇게 하면 like 값에서 마지막 세 문자가 제거됩니다 $var
.
${var%???}
...그런 다음 머리에서 $var
모든 것을 제거합니다.하지만방금 제거한 내용은 다음과 같습니다.
${var#"${var%???}"}
이 접근 방식에는 장점과 단점이 있습니다. 장점은 완전히 POSIX 이식 가능하며 모든 최신 셸에서 작동한다는 것입니다. 또한, $var
3자 이상 포함되지 않은 경우아무것도 없다그러나 후행 \n
줄이 인쇄됩니다. 그럼 또 만약 당신이생각하다이 경우 인쇄하려면 다음과 같은 추가 단계가 필요합니다.
last3=${var#"${var%???}"}
printf %s\\n "${last3:-$var}"
이렇게 하면 3바이트 이하인 경우에만 비어 있게 됩니다 $last3
. $var
그리고 비어 있는 경우 $var
에만 대체됩니다 . 또는 방금 설정했기 때문 이 아니라는 것을 알고 있습니다 .$last3
$last3
unset
unset