파일 이름에서 주어진 문자열 앞에 나타나는 숫자를 추출하는 방법은 무엇입니까?

파일 이름에서 주어진 문자열 앞에 나타나는 숫자를 추출하는 방법은 무엇입니까?

파일이 많아요

101s18-exam02--100-booklets.pdf
MATH232 Exam 01 99 booklets.pdf
35BOOKLETS.pdf

각 파일에서 "소책자"라는 단어 앞에 나타나는 숫자를 추출하는 명령을 작성하고 싶습니다(대소문자 무시). 따라서 이 명령을 실행하면 결과가 다음과 같아야 합니다.

$ bash mycommand.sh 101s18-exam02--100-booklets.pdf
100

$ bash mycommand.sh MATH232 Exam 01 99 booklets.pdf
99

$ bash mycommand.sh 35BOOKLETS.pdf
35

어떻게 해야 하나요?

답변1

grep-o플래그를 알고 있는 구현을 사용 하고 다음을 수행하십시오 tr.

#!/bin/sh

printf '%s\n' "$@" | grep -oiE '[0-9]+[^0-9]*booklets' | tr -dc '0-9\n'

이것은 스크립트입니다 ( 작동하지만 스크립트 sh는 아닙니다 ). 명령줄에서 전달된 문자열에 리터럴 개행 문자가 포함되어 있지 않다고 가정합니다.bashbash

확장 정규 표현식은 and 와 같은 문자열 [0-9]+[^0-9]*booklets과 일치하며 , 이는 정확하게 그것에서 반환됩니다 . 숫자나 개행 문자를 제외한 출력의 모든 항목을 제거합니다 .<integer><zero or more non-digit characters><"booklets">-ogreptrgrep

문자열에서 숫자가 아닌 첫 번째 문자 내의 모든 내용을 제거하는 tr로 대체될 수 있습니다 .sed 's/[^0-9].*//'

테스트해보세요:

$ sh script.sh 101s18-exam02--100-booklets.pdf
100
$ sh script.sh "MATH232 Exam 01 99 booklets.pdf"
99
$ sh script.sh 35BOOKLETS.pdf
35

$ sh script.sh 101s18-exam02--100-booklets.pdf "MATH232 Exam 01 99 booklets.pdf" 35BOOKLETS.pdf
100
99
35

공백이 포함된 문자열은 따옴표로 묶어야 합니다.

답변2

Bash의 조건부 테스트 연산자는 [[파일 이름을 정규 표현식과 비교하고 대괄호 표현식을 추출합니다.

shopt -s nocaseglob
for f in *booklets*
do
  [[ $f =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}"
done

이는 대소문자를 구분하지 않는 단어 "소책자"를 포함하는 현재 디렉토리의 모든 일치하는 파일을 반복합니다. 한 번에 하나의 파일에 대해 작업을 수행하려면 위의 내용을 단순화하고 이를 스크립트나 함수에 넣을 수 있습니다.

extractnumber ()
(
    shopt -s nocaseglob
    if [ ! -f "$1" ]; then echo "File $1 not found!"; return 1; fi
    [[ $1 =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}";
)

...그리고 다음과 같이 호출하세요.

$ extractnumber 35BOOKLETS.pdf
35
$ extractnumber MATH232\ Exam\ 01\ 99\ booklets.pdf
99
$ extractnumber 101s18-exam02--100-booklets.pdf
100
$ extractnumber foobar
File foobar not found!

답변3

나는 아래에 설명된 대로 이를 수행 pythonscript.py 하고 원하는 일치 항목을 검색하기 위해 출력을 파이프라인했습니다. 방금 Python을 사용할 수도 있었지만 출력이 파이프라인으로 처리되도록 grep을 사용하고 싶었습니다.

입력 파일 이름은 inputfilefile:

101s18-exam02--100-booklets.pdf
MATH232 Exam 01 99 booklets.pdf
35BOOKLETS.pdf

용법:

python pythonscript.py |grep -o "^[0-9]*"

여기에는 다음이 pythonscript.py포함됩니다.

#!/usr/bin/python
import re
o = open('inputfile','r')
k=re.compile(r'\d{2,3}\s?-?booklets',re.IGNORECASE)
for g in o:
    u=re.search(k,g)
    if u:
       print u.group()

산출:

100
99
35

답변4

이 sed를 사용해 볼 수 있습니다

sed -E '
  s/^/ /
  s/.*[^0-9]([0-9]+).?[bB][oO]{2}[kK][lL][eE][tT][sS].*/\1/
' infile

관련 정보