1

Я пытаюсь соответствовать 64 в:

state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,

и извлечь его.

я пробовал

echo "$line" | sed -n -e 's/^.*keycode\s\([0-9]+\).*$/\1/p'

Что, на мой взгляд, должно работать, но это не так.

После еще одного тестирования регулярное выражение успешно совпадает, пока я не начну вводить цифры.

echo "$line" | sed -n -e 's/^.*keycode\s.*/test/p'

работает нормально, но

echo "$line" | sed -n -e 's/^.*keycode\s\d.*/test/p'
echo "$line" | sed -n -e 's/^.*keycode\s[0-9].*/test/p'

и связанные не работают, даже если после пробела есть цифра.

Я что-то упускаю из виду?

1 ответ1

2

В вашем выражении sed есть только одна маленькая ошибка: символ плюс + должен быть экранирован.

echo "state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES," | sed -n -e 's/^.*keycode\s\([0-9]\+\).*$/\1/p'

выводит 64 как положено. Те из нас, кто привык к синтаксису PCRE, должны обращать внимание на различия при использовании других инструментов, таких как sed или awk , каждый из которых имеет особый набор специальных символов, некоторые из которых необходимо экранировать, а некоторые нет.

Одним из примеров является \d , который обозначает любую цифру в PCRE и имеет другое значение в sed , как указал Сайрус в своем комментарии: вместо этого следует использовать [0-9] или [[:digit:]] .

perl -e как правило, такой же способный, как sed и awk , вы можете рассмотреть возможность его использования, если предпочитаете его синтаксис. Он может быть более или менее загроможден, чем его аналоги, в зависимости от того, что вам нужно сделать.

Смотрите вводные статьи по perl -e , экспериментируйте с PCRE или читайте полезное руководство по sed или awk .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .