Wie kann man nach einem Regex-Match mit grep oder sed einfach zwei Zahlen zurückgeben?

Wie kann man nach einem Regex-Match mit grep oder sed einfach zwei Zahlen zurückgeben?

Ich schreibe ein Shellskript, das beim Start ausgeführt wird und meinen Tracking-Nub deaktiviert, der Probleme gemacht hat. Ich beginne mit xinput list, zu dem ich eine Pipe leite, grep Stickzu der ich eine Pipe leite, grep id=die mir die beiden Zahlen gibt, normalerweise 11. Die Zahlen liegen, soweit ich weiß, irgendwo zwischen 1 und 18, aber ich muss etwas wie schreiben foo=xinput list | grep Stick | grep id=und foo auf 11 setzen. Hier ist die Beispielliste für 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)]

Ich muss die Zahl direkt nach „id=“ in der Stick-Zeile abrufen, also 11.

Antwort1

Kurz gesagt, hier ist der gewünschte Befehl:

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

Es folgt eine genauere Erklärung.


Sie sollten in der Lage sein, das zu tun, was Sie wollen, grepund einen regulären Ausdruck, der einenLook-Behind-Behauptung. Die Schlüsselzutat ist der folgende grepAusdruck:

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

Dies stimmt mit Teilzeichenfolgen überein, die mit id=einer oder zwei Ziffern beginnen und von diesen gefolgt werden, gibt aber nur die Ziffern und nicht das id=Präfix zurück.

So können Sie dies testen:

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

Als Ausgabe wird Folgendes ausgegeben 11. Wenn Sie dies auf Ihren Codeausschnitt anwenden, erhalten Sie Folgendes:

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

Nehmen wir als zweiten Test an, dass wir Ihre Beispieldaten in die Datei einfügen 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)]

Führen Sie dann den folgenden Befehl aus:

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

11Als Ausgabe wird Folgendes erzeugt :

Antwort2

AlpsPS/2 ALPS DualPoint StickFür xinput angeben

Durch die Angabe des Gerätenamens xinputwird , sofern bekannt, --listnur dieses Gerät angezeigt, auf das Sie die Auswahl einschränken können --id-only:

Der Befehl:

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

gibt den ID-Wert des angegebenen Geräts zurück:

11

verwandte Informationen