문자열에서 숫자 앞의 단일 문자를 추출하는 방법

문자열에서 숫자 앞의 단일 문자를 추출하는 방법

우리 회사에서 사용할 수 있는 호스트 이름 목록이 있습니다.

예를 들어:

  • 구스와스트 03
  • gkjbossp1
  • frdwop04

숫자 앞의 마지막 문자인 은(는 t) p호스트 q환경을 나타냅니다. 모든 문자열은 숫자로 끝납니다.

  • t시험용
  • p제품에 대한
  • q품질 보증을 위해

호스트 이름과 숫자로 이어지는 문자를 얻으려면 정규식이 필요합니다. (파일에 모두 나열하지 않고 단일 문자열에 대한 솔루션이 필요합니다.)

예를 들어:

크바스03

이 문자열에서는 문자만 추출하고 싶습니다 t.

미리 감사드립니다.

답변1

grep질문에 and 로 태그를 지정했으므로 sed문자열 목록이 일부 텍스트 입력의 한 줄에 하나의 항목으로 표시된다고 가정합니다.

그 다음에:

sed -n 's/^.*\([^[:digit:]]\)[[:digit:]]\{1,\}$/\1/p' < that-input

또는 (GNU grep또는 호환 빌드에 Perl과 유사한 정규식 지원이 있다고 가정):

grep -Po '\D(?=\d+$)' < that-input

숫자가 아닌 문자로 끝나는 행의 후행 숫자 앞에 숫자가 아닌 문자를 출력하고 그 뒤에 하나 이상의 숫자가 나옵니다.

둘 다 일치를 위해 정규식을 사용하지만 sed기본 정규식과 grep -PPerl과 유사한 정규식을 사용합니다.

일부 sed구현에서는 -P이를 지원하지만 가장 일반적이지는 않습니다. -E정규식의 또 다른 방언인 확장 정규식에 대한 다양한 지원 . 그리고 그것들:

sed -E -n 's/^.*([^[:digit:]])[[:digit:]]+$/\1/p' < that-input

아니면 그냥 perl단독으로 사용할 수도 있습니다:

perl -lne 'print $1 if /(\D)\d+$/' < that-input

( perl기본적으로 문자 수준이 아닌 바이트 수준에서 작동합니다. 입력을 UTF-8 문자로 해석하거나 일반적 으로 그렇듯이 로케일 인코딩에 따라 입력/출력을 디코딩/인코딩하도록 -C지시하는 옵션을 참조하세요.) .-Mopen=localegrepsed

또는 libpcre(GNU에서 사용하는 라이브러리)와 함께 제공되는 예제 구현 pcregrep:grepgrep -P

pcregrep -o1 '(\D)\d+$' < that-input

답변2

일반 배쉬로

shopt -s extglob
for host in "${hosts[@]}"; do
  tmp=${host%%+([[:digit:]])}   # strip the trailing digits
  echo "$host => ${tmp: -1}"    # extract the last character
done
gswast03 => t
gkjbossp1 => p
frdwop04 => p

또는 정규식 일치를 사용하십시오.

for host in "${hosts[@]}"; do
  if [[ $host =~ ([^[:digit:]])[[:digit:]]+$ ]]; then
    echo "$host => ${BASH_REMATCH[1]}"
  fi
done

답변3

.*([pqt])\d+$

뒤에 ap, q 또는 t와 하나 이상의 숫자가 오는 모든 문자와 일치합니다. 일치 그룹은 귀하가 관심을 갖는 개별 문자입니다.

답변4

이는 모든 UNIX 시스템의 모든 셸에 있는 모든 sed에서 작동합니다.

$ sed 's/.*\([^0-9]\).*/\1/' file
t
p
q

위의 내용은 이 입력 파일에 대해 실행되었습니다.

$ cat file
gswast03
gkjbossp1
frdwoq04

관련 정보