Рейтинг:1

В произвольной строке текста, как bash может извлечь именованное значение после знака равенства?

флаг ao

Этот вопрос (Как получить значения после знака равенства) в основном то, что я хочу:

Дана строка текста с именованным параметром, который выглядит как синтаксис цвет = красный, используя bash, как вы можете получить это значение цвета (получив красный)?

За исключением этого вопроса, строка текста полностью состоит из этих пар ключ-значение, поэтому принятый ответ использует bash оценка так как этот синтаксис подходит очень хорошо.


Мне интересно для общей строки текста, например â â³ Synaptics TM3289-021 id=13] как я мог получить это значение идентификатора (получив 13)?

Возможно, используя регулярное выражение, где я знаю, что строка будет содержать [whitespace]id=<ТЕКСТ, который Я ХОЧУ>[whitespace]?

bac0n avatar
флаг cn
`xinput list --id-only "Мышь Logitech USB Receiver Mouse"` вы можете получить идентификатор напрямую из xinput.
Рейтинг:2
флаг it

Использовать grepх (выводить только соответствующий текст).Читать человек grep и делать:

echo "куча. text id=13 more=4" | \
  grep -E -o 'id=[0-9]+`

Если вы хотите быть особенно осторожным, сопоставьте также начальные и конечные пробелы:

echo "куча. text id=13 more=4" | \
  grep -E -o 'идентификатор = [0-9]+ '
tscizzle avatar
флаг ao
Потрясающий! Тогда я думаю, что достаточно легко поймать результирующую строку, начинающуюся после первых символов (поскольку «id =» - это 3 символа). И я также посмотрю, как искать любые пробелы вокруг него, а не только пробелы (я думаю, что в моем случае есть вкладки).
bac0n avatar
флаг cn
@tscizzle, если вам нужны все номера, например, из id= вы можете использовать просмотр назад: `grep -Po '(?
terdon avatar
флаг cn
@tscizzle вы также можете использовать Perl-совместимые регулярные выражения, у которых есть `\K` для «игнорировать все, что было сопоставлено до этого момента», что позволяет вам делать: `grep -oP 'id=\K[0-9]+`.
Рейтинг:1
флаг hr

Если ты действительно хочешь бить чтобы извлечь значение, вы можете использовать регулярное выражение с =~ оператор внутри [[ ... ]] тестовые скобки напр.:

$ re='\bid=([^[:blank:]]*)'
$ line='â â³ Synaptics TM3289-021 id=13]'
$ 
$ [[ $line =~ $re ]] && printf '%d\n' "${BASH_REMATCH[1]}"
13

Обратите внимание, что я использовал (граница слова), а не пробел в качестве начального якоря, что позволяет совпадать выражению в случае, если идентификатор = 13 происходит в начале строки, а также на полпути.

Если вы хотите использовать grep, я бы предложил использовать режим совместимости GNU grep с perl, чтобы вы могли сопоставлять, но не включать идентификатор = часть:

$ printf '%s\n' "$line" | grep -Po '(?<=id=)\w*'
13

или же

$ printf '%s\n' "$line" | grep -Po 'id=\K\w*'
13

Здесь, \ш* соответствует (возможно, пустой) последовательности символов слова - если вы хотите сопоставить только числовые идентификаторы, вы можете изменить к \ д.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.