쉘 스크립트에서 문자열의 특정 위치에 있는 문자를 얻는 방법은 무엇입니까?
답변1
Bash에서 "매개변수 확장" ${parameter:offset:length} 사용
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
동일한 매개변수 확장을 사용하여 새 변수를 할당할 수 있습니다.
$ x=${var:1:1}
$ echo $x
b
편집: 매개변수 확장 없음(아주 우아하지는 않지만 그것이 제가 먼저 생각한 것입니다)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
답변2
매개변수 확장의 대안은 다음과 같습니다.expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
예를 들어:
$ expr substr hello 2 1
e
답변3
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'
문자 이스케이프 문제를 방지하는 것입니다.https://stackoverflow.com/a/40423558/895245예를 들어:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
출력은 \
예상대로입니다.
우분투 19.04에서 테스트되었습니다.
답변4
이는 내장 기능만 사용하는 이식 가능한 POSIX 셸 변형입니다.
첫 번째는 더 읽기 쉬운 기능 대신 단일 라이너입니다.
여기에 설명된 "매개변수 확장"을 사용합니다.
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02
#!/bin/sh
x(){ s=$1;p=$2;i=0;l=${#s};while i=$((i+1));do r=${s#?};f=${s%"$r"};s=$r;case $i in $p)CHAR=$f&&return;;$l)return 1;;esac;done;}
x ABCDEF 3 # output substring at pos 3
echo $CHAR # output is 'C'
여기 oneliner가 설명합니다.
#!/bin/sh
string_get_pos()
{
local string="$1" # e.g. ABCDEF
local pos="$2" # e.g. 3
local rest first i=0
local length="${#string}" # e.g. 6
while i=$(( i + 1 )); do
rest="${string#?}" # e.g. BCDEF
first=${string%"$rest"} # e.g. A
string="$rest"
case "$i" in
$pos) export CHAR="$first" && return 0 ;;
$length) return 1 ;;
esac
done
}
string_get_pos ABCDEF 3
echo $CHAR # output is 'C'