답변:
"매개 변수 확장"이있는 bash에서 $ {parameter : offset : length}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
편집 : 매개 변수 확장없이 (매우 우아하지는 않지만 처음 나옵니다)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zsh
하고 mksh
.
매개 변수 확장의 대안은 expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
예를 들면 다음과 같습니다.
$ expr substr hello 2 1
e
substr
FreeBSD, NetBSD 또는 OS X의 expr에는 포함되어 있지 않습니다. 이것은 휴대용 솔루션이 아닙니다.
substr
원래는 GNU 확장이 아닙니다. 원래 구현은 expr
70 년대 후반에 PWB 유닉스에서오고 있었다 substr
(하지만 :
).
cut -c
변수에 개행이 포함되어 있지 않은 경우 다음을 수행 할 수 있습니다.
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
출력 :
b
awk substr
변수에 개행 문자가 있어도 작동하는 또 다른 POSIX 대안입니다.
myvar="$(printf 'a\nb\n')" # note that the last newline is stripped by
# the command substitution
awk -- 'BEGIN {print substr (ARGV[1], 3, 1)}' "$myvar"
출력 :
b
printf '%s\n'
이스케이프 문자를 피하기 문제입니다 : /programming//a/40423558/895245 예 :
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
\
예상대로 출력 합니다.
참조 : https : //.com/questions/1405611/extracting-first-two-characters-of-a-string-shell-scripting
우분투에서 테스트 19.04.
printf '%s' "$myvar" | cut -c2
개행 문자로 끝나지 printf
않는 한 텍스트 출력이 아니므로 POSIX 가 아닙니다 $myvar
. 그렇지 않으면 변수에 입력의 각 줄 을 cut
자르는 줄 바꿈 문자가 포함되어 있지 않다고 가정합니다 .
awk
하나 더 효율적이고 신뢰할 수있는 것awk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
에서는 멀티 바이트 문자 (mawk 또는 busybox awk와 동일)에서 작동하지 않습니다.
printf 'abc '| cut -c2
에는이 있기 때문에 잘못입니다 \n
(이것은 내가 모르는) 또는 (동의이) myVar에 개행 문자가있는 경우이 명령은 실패합니다?
cut
입력이 텍스트가 아닌 경우 ( cut
행은 임의의 길이를 처리하기 위해 구현이 필요 하지만) 동작 은 지정되지 않습니다 . 개행 문자로 끝나지 printf abc
않으므로 텍스트 가 출력 되지 않습니다. 실제로 구현에 따라 파이프를 파이프 cut -c2
하면 b
, b<newline>
또는 아무것도 얻지 못합니다. 당신은 필요한 것 printf 'abc\n' | cut -c2
(의 출력에 필요한 것을 POSIX에 의해 지정된 동작을 취득 b<newline>
)
cut 명령을 사용할 수 있습니다. 세 번째 자세를 얻으려면 :
echo "SAMPLETEXT" | cut -c3
이 링크를 확인하십시오 http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( 고급 사례 ) 그러나 특히 입력에 공백이있을 때 IFS를 수정하는 것도 좋습니다. 그 경우에만 아래의 것을 사용하십시오
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFS
게시 한 코드에서 어떻게 작동하는지 알 수 없습니다 .