grep 또는 sed로 정규식 일치 후 두 숫자를 반환하는 방법은 무엇입니까?

grep 또는 sed로 정규식 일치 후 두 숫자를 반환하는 방법은 무엇입니까?

작동 중인 추적 너브를 비활성화하는 시작 시 실행되는 쉘 스크립트를 작성 중입니다. 나는 로 시작합니다 xinput list. 파이프를 연결하여 grep Stick파이프를 연결하면 grep id=일반적으로 11이라는 두 개의 숫자가 나옵니다. 숫자는 내가 알 수 있는 한 1부터 18까지이지만 다음과 같은 것을 작성하고 foo=xinput list | grep Stick | grep id=설정 해야 합니다. foo를 11로 변경합니다. 다음은 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

관련 정보