
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 Stick
zu 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, grep
und einen regulären Ausdruck, der einenLook-Behind-Behauptung. Die Schlüsselzutat ist der folgende grep
Ausdruck:
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?'
11
Als Ausgabe wird Folgendes erzeugt :
Antwort2
AlpsPS/2 ALPS DualPoint Stick
Für xinput angeben
Durch die Angabe des Gerätenamens xinput
wird , sofern bekannt, --list
nur 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