grep 또는 sed와 일치하는 정규식 후에 두 개의 숫자만 반환하는 방법은 무엇입니까?

grep 또는 sed와 일치하는 정규식 후에 두 개의 숫자만 반환하는 방법은 무엇입니까?

저는 실행 중인 추적 블록을 비활성화하는 시작 시 실행되는 셸 스크립트를 작성하고 있습니다. 로 시작해서 xinput list파이프로 연결하고 grep Stick, 그런 것으로 파이프해야 하는데 grep id=, 그러면 보통 11이라는 두 개의 숫자가 나옵니다. 내가 아는 한 숫자는 1에서 18 사이일 수 있지만 foo=xinput list | grep Stick | grep id=11에는 and foo와 같은 것을 써야 합니다. 다음은 xinput 목록의 예입니다.

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=10   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
↳ Power Button                              id=6    [slave  keyboard (3)]
↳ Video Bus                                 id=7    [slave  keyboard (3)]
↳ Power Button                              id=8    [slave  keyboard (3)]
↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
↳ Toshiba input device                      id=12   [slave  keyboard (3)]
↳ TOSHIBA Web Camera - FHD                  id=13   [slave  keyboard (3)]

내가 얻어야 할 것은 Stick 행에서 id= 다음의 숫자인 11입니다.

답변1

간단히 말해서, 원하는 명령은 다음과 같습니다.

foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"

아래는 좀 더 자세한 설명입니다.


grep다음을 포함하는 정규식을 사용하여 원하는 것을 수행 할 수 있어야 합니다.과거 지향적 주장. 핵심 성분은 다음 grep표현식입니다.

grep -Po '(?<=id=)\d\d?'

이는 한 자리 또는 두 자리 숫자로 시작 하고 뒤에 한 자리 또는 두 자리 숫자가 오는 id=하위 문자열 과 일치하지만 접두어는 반환하지 않고 숫자만 반환합니다 id=.

다음을 통해 이를 테스트할 수 있습니다.

echo "id=11" | grep -Po '(?<=id=)\d\d?'

이것이 11출력이 될 것입니다. 이를 코드 조각에 적용하면 다음과 같은 결과가 생성됩니다.

foo="$(xinput list | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?')"

두 번째 테스트로 샘플 데이터를 파일에 저장한다고 가정해 보겠습니다 data.txt.

# data.txt
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad          id=10   [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint Stick             id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
↳ Power Button                              id=6    [slave  keyboard (3)]
↳ Video Bus                                 id=7    [slave  keyboard (3)]
↳ Power Button                              id=8    [slave  keyboard (3)]
↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
↳ Toshiba input device                      id=12   [slave  keyboard (3)]
↳ TOSHIBA Web Camera - FHD                  id=13   [slave  keyboard (3)]

그런 다음 다음 명령을 실행하십시오.

cat data.txt | grep -F 'Stick' | grep -Po '(?<=id=)\d\d?'

이것이 11출력이 될 것입니다.

답변2

AlpsPS/2 ALPS DualPoint Stickxinput에 할당됨

장치 이름(알려진 경우)을 지정하면 해당 장치만 지정 xinput되며 --list다음과 같이 범위를 좁힐 수 있습니다 --id-only.

주문하다:

xinput --list --id-only 'AlpsPS/2 ALPS DualPoint Stick'

지정된 장치의 ID 값을 반환합니다.

11

관련 정보