쉘 스크립트에서 문자열의 특정 위치에 있는 문자를 얻는 방법은 무엇입니까?

쉘 스크립트에서 문자열의 특정 위치에 있는 문자를 얻는 방법은 무엇입니까?

쉘 스크립트에서 문자열의 특정 위치에 있는 문자를 얻는 방법은 무엇입니까?

답변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

출력은 \예상대로입니다.

또한보십시오:https://stackoverflow.com/questions/1405611/extracting-first-two-characters-of-a-string-shell-scripting

우분투 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'

관련 정보