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


22

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

답변:


36

"매개 변수 확장"이있는 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}
바실리스

그 구문은 경우 ksh93에서 유래도에서 지원 zsh하고 mksh.
Stéphane Chazelas

6

매개 변수 확장의 대안은 expr substr

substr STRING POS LENGTH
    substring of STRING, POS counted from 1

예를 들면 다음과 같습니다.

$ expr substr hello 2 1
e

시원하고 expr을 더 철저히 확인해야합니다.
forcefsck

1
이것은 GNU coreutils의 expr과 작동하는 것처럼 보이지만 substrFreeBSD, NetBSD 또는 OS X의 expr에는 포함되어 있지 않습니다. 이것은 휴대용 솔루션이 아닙니다.
ghoti

@ghoti, substr원래는 GNU 확장이 아닙니다. 원래 구현은 expr70 년대 후반에 PWB 유닉스에서오고 있었다 substr(하지만 :).
Stéphane Chazelas

@ StéphaneChazelas, 역사적 관점을 추가해 주셔서 감사합니다. :) PWB 사용이 OP와 관련이 없다고 확신하지만 수십 년 동안 기능과 변경 사항을 추적하는 것은 항상 재미 있습니다. GNU는 많은 사람들이 기본적으로 사용하는 경향이 있지만 일반적으로 POSIX 가 아니며 주요 유니스에서 누락 된 것으로 알려진 옵션은 사용하지 않는 것이 좋습니다.
ghoti

5

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자르는 줄 바꿈 문자가 포함되어 있지 않다고 가정합니다 .
Stéphane Chazelas

awk하나 더 효율적이고 신뢰할 수있는 것awk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
스테판 Chazelas가

현재 버전의 GNU cut에서는 멀티 바이트 문자 (mawk 또는 busybox awk와 동일)에서 작동하지 않습니다.
Stéphane Chazelas

@ StéphaneChazelas 포인트 감사합니다. 당신은이 뜻 : 나는 당신이 처음에 무슨 뜻인지 이해하지 못했다 printf 'abc '| cut -c2에는이 있기 때문에 잘못입니다 \n(이것은 내가 모르는) 또는 (동의이) myVar에 개행 문자가있는 경우이 명령은 실패합니다?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
cut입력이 텍스트가 아닌 경우 ( cut행은 임의의 길이를 처리하기 위해 구현이 필요 하지만) 동작 은 지정되지 않습니다 . 개행 문자로 끝나지 printf abc않으므로 텍스트 가 출력 되지 않습니다. 실제로 구현에 따라 파이프를 파이프 cut -c2하면 b, b<newline>또는 아무것도 얻지 못합니다. 당신은 필요한 것 printf 'abc\n' | cut -c2(의 출력에 필요한 것을 POSIX에 의해 지정된 동작을 취득 b<newline>)
스테판 Chazelas가

1

zshyash, 당신은 사용하십시오 :

$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*

(에 zsh, 당신은 그것에을 단축 할 수 있습니다 printf '%s\n' $text[3]).


0

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게시 한 코드에서 어떻게 작동하는지 알 수 없습니다 .
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.