Bash 스크립트를 사용하여 문자열에서 숫자 추출

Bash 스크립트를 사용하여 문자열에서 숫자 추출

어딘가에 간단한 답변이 있을 것 같은데, 찾을 수가 없어서 여기에 질문드립니다.

.NET을 사용하여 무선 USB 키보드를 비활성화하는 스크립트를 작성하고 싶습니다 xinput --disable.

나는 xinput list | grep 2.4G\ Composite\ Devic다음과 같은 결과를 얻었습니다.

↳ 2.4G Composite Devic id=29 [slave keyboard (3)]

id=이제 이 경우 파이프로 연결할 수 있는 일반 숫자 형식 으로 29를 얻는 방법에 대한 문제에 봉착했습니다.xinput --disable

답변1

옵션 인수는 xinput장치 이름을 문자열로 허용합니다.

$ xinput --list --id-only '2.4G Composite Devic'
29
$ xinput --disable '2.4G Composite Devic' # Equivalent to 'xinput --disable 29'
  • 전체 이름이어야 합니다(와일드카드나 정규식 패턴을 포함할 수 없음).

답변2

여전히 정규식이 필요한 경우 Perl 기반 솔루션은 다음과 같습니다.

echo "↳ 2.4G Composite Devic id=29   [slave  keyboard (3)]" | perl -pe 's/.*id=(\d+)\s.*/$1/g'

답변3

사용 awk:

echo "2.4G Composite Devic id=29   [slave  keyboard (3)]" | awk '{gsub(/id=/,"",$4); print $4}'
29

사용 sed:

echo "2.4G Composite Devic id=29   [slave  keyboard (3)]" | sed 's/.*id\=\([0-9]\+\).*/\1/g'
29

grep을 사용하세요:

echo "2.4G Composite Devic id=29   [slave  keyboard (3)]" | grep -Eo 'id=[0-9]+' | grep -Eo '[0-9]+'
29

답변4

sed는 here 의 상위 집합이므로 grep다음과 같이 할 수 있습니다.

xinput list |
  sed -n '/.*2\.4G Composite Devic.*id=\([[:digit:]]\{1,\}\).*/\1/p'

확장 정규식을 sed지원 하면 더 명확해집니다.-E

xinput list |
  sed -nE '/.*2\.4G Composite Devic.*id=([[:digit:]]+).*/\1/p'

(출력 매칭 부분) grep지원 과 PCRE 구현을 통해 :-o-P

xinput list | grep -Po '2\.4G Composite Devic.*id=\K\d+'

관련 정보